2010-12-13 9 views
15

compilador GCC me da las siguientes macros:Visual C++ equivalente de __FILE__, __LINE__ y __PRETTY_FUNCTION__

  • __FILE__ para que pueda imprimir el nombre del archivo + directorio.
  • __LINE__ para que pueda imprimir el número de línea desde donde estoy imprimiendo.
  • __PRETTY_FUNCTION__ para que pueda imprimir el nombre de la función bastante

¿Tiene Visual C++ tiene el equivalente de estas macros? Una pregunta complementaria es, ¿son estos estándares para los compiladores de C++?

+0

Para las personas que quieran saber más acerca de estas macros: http://gcc.gnu.org/onlinedocs/gcc-3.4.0/gcc/Function-Names.html y http://gcc.gnu.org /onlinedocs/cpp/Standard-Predefined-Macros.html – sivabudh

Respuesta

29

En VS2008, esto:

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); 
} 

imprimirá esto:

c:\source\test_projects\blah\blah.cpp 
14 
A::Test 
[email protected]@@[email protected] 
bool __thiscall A::Test(int) 

(El número de línea es "malo" ya que había muy poco de material extra en la parte superior de mi archivo.)

2

Sé que MSVC ofrece __FILE__ y __LINE__, que son macros estándar. También ofrecen __FUNCTION__, que creo que es lo que está buscando,

5

Sí Visual C++ tiene ellos o un equivalente. Ver las respuestas aquí:

What's the difference between __PRETTY_FUNCTION__, __FUNCTION__, __func__? función func/4384860 # 4384860

También tenga en cuenta que a pesar de la mayúscula utilizados, no son macros. Son variables.

+1

Tienen _are_ macro's.Simplemente verifique el título de su página de MSDN: [Macros predefinidas] (http://msdn.microsoft.com/nl-nl/library/b0084kay.aspx) – MSalters

+0

@MSalters: hmmm ... de acuerdo con [gcc docs] (http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Function-Names.html) son variables. Parece que VC++ lo implementa de manera diferente. – sashang

8

__FILE__ y __LINE__ son estándar, y estoy seguro de que los compiladores de Microsoft esencialmente siempre los han tenido.

__PRETTY_FUNCTION__ es una función de gcc.

3

__FILE__ y __LINE__ son estándar desde C89. __PRETTY_FUNCTION__ es un GCCism. __func__ es un C99ism que (a diferencia de GCCisms) bien puede estar disponible en Visual C++; no es exactamente lo mismo que __PRETTY_FUNCTION__ pero puede ser lo suficientemente cerca para sus propósitos.

1
  1. Sí, Microsoft Visual Studio ha __FILE__ y __LINE__. Here are more MSVC macros.

  2. Ambos son ANSI C++.

  3. MSVC tiene __FUNCTION__, que es específico de Microsoft.

6

Para obtener más portabilidad al obtener el nombre de la función actual, puede intentar BOOST_CURRENT_FUNCTION.

+0

Oh wow, esto es increíble. Gracias por mencionarlo. – sivabudh

Cuestiones relacionadas