如何在C中标记和跨步化_ufunc_uu宏?
我想用宏标记和标记我们所处函数的名称,以重载C中的函数(使用dlopen()) 我在如何在C中标记和跨步化_ufunc_uu宏?,c,c-preprocessor,C,C Preprocessor,我想用宏标记和标记我们所处函数的名称,以重载C中的函数(使用dlopen()) 我在\uuuu LINE\uuuu和\uuu FILE\uuuu中发现了类似的东西,但在\uu func\uuuu中似乎有点不同 我试过: #define OVERLOAD2(f) printf("Trying to overload function %s...", #f) #define OVERLOAD1(f) OVERLOAD2(f) #define OVERLOAD OVERLOAD1(__func__)
\uuuu LINE\uuuu
和\uuu FILE\uuuu
中发现了类似的东西,但在\uu func\uuuu
中似乎有点不同
我试过:
#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草案中关于
\uuuu func\uuu
的内容:
1标识符uuu func_uuu应由
翻译好像,紧接着每个
函数定义、声明
static const char\uuuu func\uuuu[]=“函数名”代码>
如您所见,\uuuuu func\uuuuu
与\uuuu FILE\uuuu
和\uuuu LINE\uuuuu
不同,它不是预处理器宏,因此在预处理阶段无法对其求值
但是在您的代码中,您甚至不需要这样做。换衣服
#define OVERLOAD2(f) printf("Trying to overload function %s...", #f)
到
正如您在标准对\uuuu func\uuuu
的描述中所看到的,它已经是一个字符串。没有必要把它串起来
如果在编译时需要函数名作为“裸字”,例如隐式的\define\uuuu FUNC\uuuuu myfunc
,那就太不走运了
这在标准C中是不可能的。GCC另外还提供了_函数_,但尽管它的所有caps名称,GCC手册说:
两者都不是宏观的;预处理器不知道的名称
当前函数
MSVC以宏的形式提供了\uuuuu函数
,但它被定义为字符串,不能去掉双引号
唯一的解决办法是编写自己的预处理器或重新思考您的方法什么是\uuuu func\uuu
宏?你在哪里看到的?@iharob:“strize”是什么意思?这是一个单词吗?@Olaf我知道它的名字是stringize
。对宏求值并将值转换为字符串是一种常见的宏对。@a3f:lessz
,mores
,当然,这是已知的。我只是想知道:打字错误还是推特炎?至少标题行应该没有明显的打字错误。谢谢,把这个字符串化没关系,但是如何标记它呢?我想做一些事情,比如\uuuufunc\u35;#ufoo
,调用另一个以当前函数名为前缀的函数。@Tsigorf您不能。我延长了我的回答。
#define OVERLOAD printf("Trying to overload function %s...", __func__)