如何在C中标记和跨步化_ufunc_uu宏?

如何在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__)

我想用宏标记和标记我们所处函数的名称,以重载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__)

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:less
z
,more
s
,当然,这是已知的。我只是想知道:打字错误还是推特炎?至少标题行应该没有明显的打字错误。谢谢,把这个字符串化没关系,但是如何标记它呢?我想做一些事情,比如
\uuuufunc\u35;#ufoo
,调用另一个以当前函数名为前缀的函数。@Tsigorf您不能。我延长了我的回答。
#define OVERLOAD printf("Trying to overload function %s...", __func__)