【问题标题】:C++ Concatinating __func__ and const char literalC++ 连接 __func__ 和 const char 文字
【发布时间】:2014-12-04 13:57:24
【问题描述】:

我正在尝试在 C++ 中连接 __ func__ 和文字字符串,但在 GCC 上出现错误(有或没有 C++11 标准)。例如,这里:

#include <cstdio>

int main(void)
{
        printf("%s", __func__ " try #1\n");
        printf(__func__ " try #2\n");
        return 0;
}

看起来 __ func__ 实际上不是字符串文字宏。有谁知道为什么会发生这种情况,也许还有解决方法?

【问题讨论】:

  • 当然__func__ 不是一个哑字符串宏。只是“%s%s”有什么问题?还有使用正确的 C++ 工具有什么问题,比如std::stringstd::cout
  • @Griwes “当然”?考虑到 __FILE____LINE__ 宏,我可以理解为什么 OP 可能会认为 __func__ 也是。
  • printf("%s try #1\n", __func__ ) 有什么问题?您尝试执行的编译时连接类型仅适用于字符串文字(即常量字符串)。
  • @hvd 当然“当然”。预处理器不可能知道它当前是什么函数(但它确实知道它正在处理什么行或文件)。
  • @Griwes 许多编译器都集成了预处理器,有些确实提供了类似于__func__ 的东西,除了宏。在至少一个编译器上,printf("We're now in " __FUNCTION__ "\n"); 编译没有任何问题。

标签: c++ function macros


【解决方案1】:

__func__ 确实既不是字符串文字也不是宏。它的 C++11 8.4.1/8 规范是

函数局部预定义变量__func__被定义为表单的定义

static const char __func__[] = "function-name ";

已经提供

所以你必须把它当作一个静态数组,而不是一个字符串字面量;特别是,您不能将它与其他文字连接。

printf("%s%s", __func__, " try #1\n");
printf("%s try #2\n", __func__);
std::string message = __func__ + std::string(" try #3");

【讨论】:

    【解决方案2】:

    从技术上讲,__func__ 是一个预定义标识符。它从不作为宏实现。

    它的类型为static const char __func__[],因此您不能按照自己的方式连接它。当然,您可以将其添加到 std::string

    使用

    printf("%s try #1\n", __func__);

    改为。

    【讨论】:

    • 感谢您对 __ func__ 的解释。我真的考虑过使用 __ func__ 作为字符串文字,现在我发现这是不可能的。
    猜你喜欢
    • 2018-11-03
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 2013-03-25
    • 2010-12-31
    相关资源
    最近更新 更多