GCC编译器为我提供了以下宏:
__FILE__
以便我可以打印出文件名+目录。__LINE__
这样我就可以打印出我要打印的行号。__PRETTY_FUNCTION__
这样我就可以打印出漂亮的函数名称Visual C ++是否具有这些宏的等价物?一个侧面问题是,这些是C ++编译器的标准吗?
答案 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)
__FILE__
和__LINE__
是标准配置。 __PRETTY_FUNCTION__
是海湾合作委员会。 __func__
是一个C99主义(与GCCisms不同)可能在Visual C ++中可用;它与__PRETTY_FUNCTION__
不完全相同,但它可能足够接近您的目的。
答案 5 :(得分:2)
我知道MSVC提供__FILE__
和__LINE__
,这两者都是标准宏。他们还提供__FUNCTION__
,我认为这是你正在寻找的,
答案 6 :(得分:1)
是的,Microsoft Visual Studio有__FILE__
和__LINE__
。 Here are more MSVC macros
两者都是ANSI C ++。
MSVC拥有__FUNCTION__
,这是特定于Microsoft的。
答案 7 :(得分:0)
将c++14与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