C++宏获取完整函数路径和声明

C++宏获取完整函数路径和声明,c++,c++11,C++,C++11,我想通过宏或一些编译器魔术在代码中获得完整的函数路径和声明。我有以下代码: 我的问题是: 如何获取调用的sum函数的完整路径?NS::Foo::sum 如何获得参数类型的完整函数声明?sumint,int或sumint,int,int 我对主流编译器有兴趣:Clang、GCC、微软C++编译器 回答GCC。< /P> 签出宏。我在中的assert宏定义中找到了它。对于其他编译器和libc实现,可能也可以找到相同的方法。对于Microsoft Visual Studio编译器,\uuuu FUNC

我想通过宏或一些编译器魔术在代码中获得完整的函数路径和声明。我有以下代码:

我的问题是:

如何获取调用的sum函数的完整路径?NS::Foo::sum 如何获得参数类型的完整函数声明?sumint,int或sumint,int,int 我对主流编译器有兴趣:Clang、GCC、微软C++编译器

回答GCC。< /P>
签出宏。我在中的assert宏定义中找到了它。对于其他编译器和libc实现,可能也可以找到相同的方法。

对于Microsoft Visual Studio编译器,\uuuu FUNCSIG\uuuuu可以为您提供有关该函数的很多信息

__FUNCSIG__;将为您提供完整的函数签名 __FUNCDNAME_u;给出magnled的名称。
__函数只代表函数名。

如果您不想将自己局限于一个编译器,也不想自己编写预处理器ifdef链,boost已经定义了一个宏,该宏定义为在所用编译器上定义的完整函数签名宏__GCC中的PrTyGy函数和支持它的其他编译器,即支持MSVC的“γ函数”,也支持一些使用较少的编译器,并返回到由C标准定义的“γ函数”或静态占位符(即使不支持)。

C不是C++,不是C!奥拉夫,谢谢你的编辑。我理解,这只是一个坏习惯。宏被预处理器处理是有原因的。它们是文本替换,对普通C++代码BTW.不知道。这对于所有的预处理器是相同的。函数没有路径。你是指完全限定的名称NS::Foo::sum吗?如果你这样做,参见奥拉夫:C++不是java不是C++,和是成员函数。德妮丝!它甚至在叮当声中得到了支持。感谢成为VisualStudio所需的一切。非常感谢。
#include <iostream>

namespace NS {

    struct Foo {
        static int sum(int a, int b) {
            std::cout << "This is from " << __FILE__ << ":" << __LINE__ << " @ " <<     __func__ << std::endl;
            return a+b;
        }

        static int sum(int a, int b, int c) {
            std::cout << "This is from " << __FILE__ << ":" << __LINE__ << " @ " <<     __func__ << std::endl;
            return a+b+c;
        }

   };
}

int main() {
    NS::Foo::sum(1,2);
    NS::Foo::sum(1,2, 3);
}
This is from /some/where/main.cpp:7 @ sum
This is from /some/where/main.cpp:12 @ sum