【问题标题】:__func__ not replaced in preprocessed output__func__ 未在预处理输出中替换
【发布时间】:2015-03-10 01:38:51
【问题描述】:

我正在阅读 C/C++ 中的 __FUNCTION__ / __func__ (它们用于打印使用它们的函数的名称)。我读到的每个地方都说这些是宏并且在预处理时被替换。因此,我通过使用命令gcc -E prog.c 查看预处理后的输出对此进行了调查。但是我看到__func____FUNCTION__都没有被预处理器替换为函数名。

那么,它是一个宏吗?如果不是,它是什么以及它是如何实现的?

编辑

甚至尝试过cpp prog.c。但仍然没有被替换。

另外__FILE__, __LINE__, and __FUNCTION__ usage in C++ 这个帖子说它永远不会影响性能。请澄清。

【问题讨论】:

    标签: c++ c macros


    【解决方案1】:

    它们被实现为(并且是)“魔术变量”。 The manual says:

    GCC 提供了三个以字符串形式保存当前函数名称的魔法变量。 其中第一个是 __func__,它是 C99 标准的一部分:

    标识符__func__ 由翻译器隐式声明,好像立即 在每个函数定义的左大括号之后,声明

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

    出现,其中function-name 是词法封闭函数的名称。这个名字 是函数的朴素名称。

    它们通常不能作为预处理器宏实现;预处理器不解析函数范围。当然,预处理器可以理解足够多的语法来知道函数在哪里开始和结束,但通常它们不是在那个级别上运行的。

    【讨论】:

      【解决方案2】:

      __func__ 本质上是一个预定义变量,而不是宏。其中__FUNCTION__ 将被扩展,__func__ 不会被扩展,并且会像您在函数中定义以下内容一样使用:

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

      static const char __func__[] = __FUNCTION__;
      

      请参考:

      __func__ 的意图与__FUNCTION__ 相似,但传递方式不同。

      http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2004/n1642.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-14
        • 2015-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        • 2011-01-17
        相关资源
        最近更新 更多