Visual C ++相当于__FILE __,_ _ _ ____和__PRETTY_FUNCTION__

时间:2010-12-13 22:53:53

标签: c++ visual-c++ gcc compiler-construction

GCC编译器为我提供了以下宏:

  • __FILE__以便我可以打印出文件名+目录。
  • __LINE__这样我就可以打印出我要打印的行号。
  • __PRETTY_FUNCTION__这样我就可以打印出漂亮的函数名称

Visual C ++是否具有这些宏的等价物?一个侧面问题是,这些是C ++编译器的标准吗?

8 个答案:

答案 0 :(得分:31)

在VS2008中,这个:

struct A
{
    bool Test(int iDummyArg)
    {
        const char *szFile = __FILE__;
        int iLine = __LINE__;
        const char *szFunc = __FUNCTION__; // Func name
        const char *szFunD = __FUNCDNAME__; // Decorated
        const char *szFunS = __FUNCSIG__; // Signature

        printf("%s\n", szFile);
        printf("%d\n", iLine);
        printf("%s\n", szFunc);
        printf("%s\n", szFunD);
        printf("%s\n", szFunS);

        return true;
    }
};

int wmain(int argc, TCHAR *lpszArgv[])
{
    A a;
    a.Test(10);
}

将打印出来:

c:\source\test_projects\blah\blah.cpp
14
A::Test
?Test@A@@QAE_NH@Z
bool __thiscall A::Test(int)

(行号是“错误的”,因为我的文件顶部确实有一些额外的东西。)

答案 1 :(得分:9)

__FILE____LINE__是标准配置,而且我相信Microsoft编译器基本上总是拥有它们。

__PRETTY_FUNCTION__是gcc功能。

答案 2 :(得分:7)

为了获得当前函数名称的更多可移植性,您可以尝试BOOST_CURRENT_FUNCTION

答案 3 :(得分:6)

是Visual C ++有它们或等价物。请参阅此处的回复:

What's the difference between __PRETTY_FUNCTION__, __FUNCTION__, __func__? 功能FUNC / 4384860#4384860

另请注意,尽管使用了大写字母,但它们不是宏。他们是变数。

答案 4 :(得分:3)

自C89以来,

__FILE____LINE__是标准配置。 __PRETTY_FUNCTION__是海湾合作委员会。 __func__是一个C99主义(与GCCisms不同)可能在Visual C ++中可用;它与__PRETTY_FUNCTION__不完全相同,但它可能足够接近您的目的。

答案 5 :(得分:2)

我知道MSVC提供__FILE____LINE__,这两者都是标准宏。他们还提供__FUNCTION__,我认为这是你正在寻找的,

答案 6 :(得分:1)

  1. 是的,Microsoft Visual Studio有__FILE____LINE__Here are more MSVC macros

  2. 两者都是ANSI C ++。

  3. MSVC拥有__FUNCTION__,这是特定于Microsoft的。

答案 7 :(得分:0)

constexpr结合使用,您可以使用以下代码:WHERE宏。

基于以下用途:

#include "string/ConstexprString.hpp"

#define S1(x) #x
#define S2(x) S1(x)

// WHERE - const char* const should be used as temporary value
#define WHERE (string::make(__PRETTY_FUNCTION__) + ":" + string::make(S2(__LINE__))).get()

// It is safe to store e.g. `constexpr auto where = WHERE_STR;`
#define WHERE_STR (string::make(__PRETTY_FUNCTION__) + ":" + string::make(S2(__LINE__)))

用法示例:

    // Called: void (anonymous namespace)::exampleUseCaseWhere(int):18
    std::cout << "Called: " << WHERE << std::endl;

完全运行example here

请参阅: