Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何获取当前函数的标识符?_C++_C_Macros_C Preprocessor - Fatal编程技术网

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

C++ 如何获取当前函数的标识符?,c++,c,macros,c-preprocessor,C++,C,Macros,C Preprocessor,在C/C++中,我们有一个\uuuu FUNCTION\uuu宏,它被替换为一个字符串,保存当前函数的名称。但是如果我想要函数的标识符呢?也就是说,不是一个字符串,而是我可以用来作为标记来创建其他标识符的东西,例如,如果我们有 #define MAGIC /* ... */ #define MORE_MAGIC MAGIC ## _bar void foo() { printf("%s\n",__FUNCTION__); MORE_MAGIC(); } void foo_b

在C/C++中,我们有一个
\uuuu FUNCTION\uuu
宏,它被替换为一个字符串,保存当前函数的名称。但是如果我想要函数的标识符呢?也就是说,不是一个字符串,而是我可以用来作为标记来创建其他标识符的东西,例如,如果我们有

#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

注意事项:

  • 我只对预处理时间感兴趣
  • 我不希望用预处理器调用替换我的函数定义——尽管我知道这可能会起作用

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

#define MORE_MAGIC(f) f##_bar

...

void foo_bar()
{
}

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

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

不幸的是,您不能。因为无法解除宏[]的结构


换句话说,不能删除由<代码>、函数>、代码>生成的字符串的引用,并通过<代码> >栏>代码>联系。

C和C++没有,所以不可能。你可以在函数名和函数指针之间手工制作映射,但这是不可能实现自动化的。@JoachimPileborg:我相信OP是在问编译时魔法,而不是运行时魔法(即内省)。@JoachimPileborg我同意自动化一般来说是困难的,如果不是不可能的话,但是,根据@einpoklum对讨厌的宏的容忍度,对于特殊情况来说可能很容易。您可以定义扩展到函数原型的DEF_FUNC宏,以及函数在某种函数指针表中的注册。例如,
DEF_FUNC(f)void f(){寄存器(f,_函数u)通常C/C++预处理器不做字符串操作,但是如果你有比“JoaHipIrBig”更复杂的情况,下面的EasyTI支持并愿意冒险进入奇怪的东西,有这样的事情:我必须问:为什么你认为你需要这个?我同意。在类似的情况下,我必须写一个C++包装器,I SImply编写了一个perl脚本,在编译时将
foo.cpp.tmpl
处理成最终的
foo.cpp
。是的,
\uuuuuu函数\uuuuuu
是一个字符串文本,您对此无能为力。我并没有说我想取消函数的字符串化,我想知道编译器或预处理器是否提供我集成的功能直接在.cin EnPoCulu:我明白你的意思。标准C++中的一种可能性是不严格化<代码>函数>代码>这是不可能的。也许有一个编译器魔法来完成它,但是它不是标准的和可移植的方式。