2010-12-13 14 views
15

compilatore GCC mi dà le seguenti macro:Visual C++ equivalente di __FILE__, __LINE__ e __PRETTY_FUNCTION__

  • __FILE__ modo che io possa stampare il nome del file + directory.
  • __LINE__ in modo da poter stampare il numero di riga di dove sto stampando.
  • __PRETTY_FUNCTION__ modo che io possa stampare il nome della funzione abbastanza

Fa Visual C++ hanno l'equivalente di queste macro? Una domanda secondaria è, sono questi standard per i compilatori C++?

+0

Per le persone che potrebbero voler saperne di più su queste macro: http://gcc.gnu.org/onlinedocs/gcc-3.4.0/gcc/Function-Names.html e http://gcc.gnu.org /onlinedocs/cpp/Standard-Predefined-Macros.html – sivabudh

risposta

29

In VS2008, questo:

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

stamperà questo:

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

(Il numero di riga è "sbagliato" in quanto non v'è stato davvero un po 'di roba in più in cima alla mia file.)

2

So che MSVC offre __FILE__ e __LINE__, che sono entrambi macro standard. Offrono anche __FUNCTION__, che credo sia quello che stavi cercando,

5

Sì Visual C++ li ha o un equivalente. Vedi le risposte qui:

What's the difference between __PRETTY_FUNCTION__, __FUNCTION__, __func__? funzione-func/4384860 # 4384860

Si noti inoltre che, nonostante la maiuscola utilizzati, non sono le macro. Sono variabili.

+1

They are macro.Basta controllare il titolo della loro pagina MSDN: [Macro predefinite] (http://msdn.microsoft.com/nl-nl/library/b0084kay.aspx) – MSalters

+0

@MSalters: hmmm ... secondo [gcc docs] (http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Function-Names.html) sono variabili. Sembra che VC++ lo implementa diversamente. – sashang

8

__FILE__ e __LINE__ sono standard, e sono piuttosto certo che i compilatori Microsoft hanno essenzialmente sempre avuto.

__PRETTY_FUNCTION__ è una funzionalità di gcc.

3

__FILE__ e __LINE__ sono standard dal C89. __PRETTY_FUNCTION__ è un GCCism. __func__ è un C99ism che (diversamente da GCCisms) potrebbe essere disponibile in Visual C++; non è esattamente uguale a __PRETTY_FUNCTION__ ma potrebbe essere abbastanza vicino ai tuoi scopi.

1
  1. Sì, Microsoft Visual Studio ha __FILE__ e __LINE__. Here are more MSVC macros.

  2. Entrambi sono ANSI C++.

  3. MSVC ha __FUNCTION__, che è specifico di Microsoft.

6

Per maggiore portabilità nell'ottenere il nome della funzione corrente, è possibile provare BOOST_CURRENT_FUNCTION.

+0

Oh wow, è fantastico. Grazie per averlo menzionato. – sivabudh