Visual С++ эквивалент __FILE__, __LINE__ и __PRETTY_FUNCTION__
Компилятор GCC дает мне следующие макросы:
-
__FILE__
чтобы я мог распечатать имя файла + каталог. -
__LINE__
чтобы я мог распечатать номер строки, из которой я печатаю. -
__PRETTY_FUNCTION__
чтобы я мог распечатать красивое имя функции
Имеет ли Visual C++ эквивалент этих макросов? Вопрос в том, являются ли эти стандартные для компиляторов C++?
Ответы
Ответ 1
В 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
[email protected]@@[email protected]
bool __thiscall A::Test(int)
(Номер строки является "неправильным", так как в верхней части моего файла действительно был какой-то дополнительный материал.)
Ответ 2
__FILE__
и __LINE__
являются стандартными, и я уверен, что компиляторы Microsoft по существу всегда имели их.
__PRETTY_FUNCTION__
- это функция gcc.
Ответ 3
Для большей переносимости при получении текущего имени функции вы можете попробовать BOOST_CURRENT_FUNCTION.
Ответ 4
Да Visual С++ имеет их или эквивалент. См. Ответы здесь:
В чем разница между __PRETTY_FUNCTION__, __FUNCTION__, __func__?
Функция-FUNC/4384860 # 4384860
Также обратите внимание, что, несмотря на использование верхнего регистра, они не являются макросами. Это переменные.
Ответ 5
__FILE__
и __LINE__
являются стандартными с C89. __PRETTY_FUNCTION__
является GCCism. __func__
- это C99ism, который (в отличие от GCCisms) вполне может быть доступен в Visual С++; это не совсем то же самое, что и __PRETTY_FUNCTION__
, но оно может быть достаточно близко для ваших целей.
Ответ 6
Я знаю, что MSVC предлагает __FILE__
и __LINE__
, оба из которых являются стандартными макросами. Они также предлагают __FUNCTION__
, который, я считаю, является тем, что вы ищете,
Ответ 7
-
Да, Microsoft Visual Studio имеет __FILE__
и __LINE__
. Вот несколько макросов MSVC.
-
Оба являются ANSI С++.
-
MSVC имеет __FUNCTION__
, который специфичен для Microsoft.
Ответ 8
Используя 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;
Полный и работающий пример здесь
Увидеть: