如何获取当前函数的标识符?

ein*_*ica 8 c c++ macros c-preprocessor

在C/C++中,我们有__FUNCTION__一个用字符串替换的宏,它保存当前函数的名称.但是,如果我想要函数的标识符怎么办?也就是说,不是字符串,而是我可以用作令牌来创建其他标识符,例如,如果我们有

#define MAGIC /* ... */

#define MORE_MAGIC MAGIC ## _bar

void foo() {
    printf("%s\n",__FUNCTION__);
    MORE_MAGIC();
}

void foo_bar() {
    printf("%s\n",__FUNCTION__);
}

void baz() {
    printf("%s\n",__FUNCTION__);
    MORE_MAGIC();
}

void baz_bar() {
    printf("%s\n",__FUNCTION__);
}

int main() {
    foo();
}
Run Code Online (Sandbox Code Playgroud)

应该打印

foo
foo_bar
baz
baz_bar
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 我只对预处理时间感兴趣.
  • 我宁愿不用预处理器调用替换我的函数定义 - 虽然我知道这可能会起作用.

Som*_*ude 2

如果您想要编译时,并且对于像您这样的简单情况,则可以使用预处理器宏和串联运算符##。也许像

#define MORE_MAGIC(f) f##_bar

...

void foo_bar()
{
}

void foo()
{
    MORE_MAGIC(foo)();
}
Run Code Online (Sandbox Code Playgroud)

但不可能foo自动获取名称,必须在宏“call”中显式命名。