如何在C中标记和强化__func__宏?

时间:2016-05-31 18:42:02

标签: c c-preprocessor

我希望 tokenize strize ,用宏(我们所在的函数的名称)来重载函数(使用dlopen()),在C中。

我在__LINE____FILE__找到了类似的内容,但在__func__的情况下似乎有点不同......

我试过了:

#define OVERLOAD2(f) printf("Trying to overload function %s...", #f)
#define OVERLOAD1(f) OVERLOAD2(f)
#define OVERLOAD OVERLOAD1(__func__)

int main() {
    OVERLOAD;
}

使用不同的编译标准(c99,gnu11)进行编译不会改变结果;而不是打印:

Trying to overload function main...

打印:

Trying to overload function __func__...

如何更正这些宏?

1 个答案:

答案 0 :(得分:6)

以下是C11草案中关于__func__的说法:

  

1 标识符__func__应由。隐式声明   翻译好像,紧跟着每个人的开口支撑   函数定义,声明

     

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

如您所见__func__,与__FILE____LINE__不同,它不是预处理器宏,因此您无法在预处理阶段对其进行评估。

您的代码中

,您甚至不需要这样做。只需改变

#define OVERLOAD2(f) printf("Trying to overload function %s...", #f)

#define OVERLOAD printf("Trying to overload function %s...", __func__)

正如您在标准__func__的描述中所看到的,它已经是一个字符串。无需将其串联。

如果在编译时需要将函数名称作为“裸字”,例如一个隐含的#define __FUNC__ myfunc,你运气不好。

在标准C中不可能.GCC另外提供__FUNCTION__,但是尽管它有全部大写字母,但GCC手册说:

  

它们都不是宏;预处理器不知道名称   当前的功能。

MSVC提供__FUNCTION__作为宏,但它被定义为一个字符串,你不能去除双引号。

只有这样才能编写自己的预处理器或重新思考方法