我想用宏来标记和强化我们所在函数的名称,以便在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)
我该如何纠正这些宏?
以下是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__宏作为宏,但它被定义为一个字符串,你不能剥离双引号.
只有这样才能编写自己的预处理器或重新思考您的方法