我想用宏来标记化和strize,我们所在的函数的名称,以重载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;
}
使用不同的编译标准(c99、gnu11)进行编译不会改变结果;而不是打印:
Trying to overload function main...
它打印:
Trying to overload function __func__...
如何更正这些宏?
最佳答案
以下是 C11 草案关于 __func__
的内容:
1 The identifier __func__ shall be implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declaration
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 手册却说:
Neither of them is a macro; the preprocessor does not know the name of the current function.
MSVC 提供 __FUNCTION__
作为宏,但它被定义为字符串,并且您无法去掉双引号。
解决这个问题的唯一方法是编写自己的预处理器或重新考虑您的方法
关于c - 如何在 C 中标记化和 strize __func__ 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37553321/