2010-12-13 2 views
15

GCC компилятор дает мне следующие макросы:Visual C++ эквивалент __FILE__, __LINE__ и __PRETTY_FUNCTION__

  • __FILE__ так, что я могу напечатать имя файла + каталог.
  • __LINE__, так что я могу распечатать номер строки, где я печатаю.
  • __PRETTY_FUNCTION__ так, что я могу распечатать симпатичное имя функции

ли Visual C++ есть эквивалент этих макросов? Вопрос в том, являются ли эти стандартные для компиляторов C++?

+0

Для людей, которые хотят узнать больше об этих макросах: http://gcc.gnu.org/onlinedocs/gcc-3.4.0/gcc/Function-Names.html и http://gcc.gnu.org /onlinedocs/cpp/Standard-Predefined-Macros.html – sivabudh

ответ

29

В 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

Я знаю, что MSVC предлагает __FILE__ и __LINE__, оба из которых являются стандартными макросами. Они также предлагают __FUNCTION__, который, я считаю, является тем, что вы ищете,

5

Да Visual C++ имеет их или эквивалент. Смотрите ответы здесь:

What's the difference between __PRETTY_FUNCTION__, __FUNCTION__, __func__? -функции FUNC/4384860 # 4384860

Также отметим, что, несмотря на верхний регистр используется, они не являются макросы. Они переменные.

+1

Они _are_ macro's.Просто проверьте заголовок своей страницы MSDN: [Предопределенные макросы] (http://msdn.microsoft.com/nl-nl/library/b0084kay.aspx) – MSalters

+0

@MSalters: hmmm ... согласно [gcc docs] (http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Function-Names.html), они являются переменными. Похоже, VC++ реализует его по-разному. – sashang

8

__FILE__ и __LINE__ являются стандартными, и я уверен, что компиляторы Microsoft по существу всегда имели их.

__PRETTY_FUNCTION__ - функция gcc.

3

__FILE__ и __LINE__ являются стандартными с C89. __PRETTY_FUNCTION__ - это GCCism. __func__ - это C99ism, который (в отличие от GCCisms) вполне может быть доступен в Visual C++; это не то же самое, что и __PRETTY_FUNCTION__, но оно может быть достаточно близко для ваших целей.

1
  1. Да, Microsoft Visual Studio имеет __FILE__ и __LINE__. Here are more MSVC macros.

  2. Оба являются ANSI C++.

  3. MSVC имеет __FUNCTION__, который является специфичным для Microsoft.

6

Для большей переносимости при получении текущего имени функции вы можете попробовать BOOST_CURRENT_FUNCTION.

+0

О, ничего себе, это здорово. Спасибо, что упомянул об этом. – sivabudh

Смежные вопросы