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

Luk*_*uka -1 c c-preprocessor

我想用宏来标记强化我们所在函数的名称,以便在C中重载函数(使用dlopen()).

我用__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;
}
Run Code Online (Sandbox Code Playgroud)

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

Trying to overload function main...
Run Code Online (Sandbox Code Playgroud)

它打印:

Trying to overload function __func__...
Run Code Online (Sandbox Code Playgroud)

我该如何纠正这些宏?

a3f*_*a3f 6

以下是C11草案中所说的内容__func__:

1 标识符__func__应由翻译者隐式声明,就像紧接在每个函数定义的左括号之后的声明一样

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

正如你看到的__func__,不像__FILE__并且__LINE__,没有预处理宏,所以在预处理阶段,你不能评价它.

但是在你的代码中,你甚至不需要这样做.只是改变

#define OVERLOAD2(f) printf("Trying to overload function %s...", #f)
Run Code Online (Sandbox Code Playgroud)

#define OVERLOAD printf("Trying to overload function %s...", __func__)
Run Code Online (Sandbox Code Playgroud)

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


如果在编译时需要将函数名称作为"裸字",例如隐式#define __FUNC__ myfunc,则运气不佳.

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

它们都不是宏观; 预处理器不知道当前函数的名称.

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

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