【发布时间】:2014-03-11 08:45:42
【问题描述】:
在 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
注意事项:
- 我只对预处理时间感兴趣。
- 我宁愿不使用预处理器调用替换我的函数定义 - 尽管我知道这可能会起作用。
【问题讨论】:
-
C 和 C++ 没有introspection,所以不可能。您可以在函数名和函数指针之间进行手工映射,但无法实现自动化。
-
@JoachimPileborg:我相信 OP 询问的是编译时魔法,而不是运行时魔法(即内省)。
-
@JoachimPileborg 我同意自动化通常会很困难,如果不是不可能的话,但是对于特殊情况来说可能很容易,这取决于@einpoklum 对讨厌的宏的容忍度。您可以定义扩展为函数原型的 DEF_FUNC 宏以及在某种函数指针表中注册函数。 IE。
DEF_FUNC(f) void f() { REGISTER(f, __FUNCTION__) -
通常 c/c++ 预处理器不进行字符串操作,但如果你有比@JoachimPileborg 答案更复杂的情况,下面的 easilty 支持并愿意冒险研究奇怪的东西,就会有这样的事情: insanecoding.blogspot.se/2011/10/stronger-cc-preprocesser.html
-
我不得不问:你认为你为什么需要这个?
标签: c++ c macros c-preprocessor