我希望 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__...
如何更正这些宏?
答案 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__
作为宏,但它被定义为一个字符串,你不能去除双引号。
只有这样才能编写自己的预处理器或重新思考方法