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

时间:2014-03-11 08:45:42

标签: 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();
}

应该打印

foo
foo_bar
baz
baz_bar

注意:

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

2 个答案:

答案 0 :(得分:3)

不幸的是你做不到。因为您无法取消分析宏[1]。

换句话说,您无法删除__FUNCTION__生成的字符串周围的引号,并通过_bar与其联系。

答案 1 :(得分:2)

如果它是你想要的编译时间,对于像你这样的简单情况,可能有预处理器宏和连接运算符##。也许像是

#define MORE_MAGIC(f) f##_bar

...

void foo_bar()
{
}

void foo()
{
    MORE_MAGIC(foo)();
}

虽然无法自动获取名称foo,但必须在宏“call”中明确命名。