2010-02-03 13 views
38

__FILE__ e __LINE__ sono ben noti. C'è un __func__ da C99.Macro/parola chiave che può essere utilizzata per stampare il nome del metodo?

#include <iostream> 
struct Foo { 
     void Do(){ std::cout << __func__ << std::endl; } 
}; 

int main() 
{ 
     std::cout << __func__ << std::endl; 
     Foo foo; foo.Do(); 
     return 0; 
} 

uscita volontà

main 
Do 

C'è qualche macro/parola chiave che sarebbe uscita nome del metodo come Foo::Do?

+1

Impossibile decidere la risposta migliore. Faccio clic su qualcosa e mi scuso con il resto :-). – Notinlist

+0

correlati: http://stackoverflow.com/questions/4384765/whats-the-difference-between-pretty-function-function-func –

risposta

72

Boost ha una macro di utilità speciale denominata BOOST_CURRENT_FUNCTION che nasconde le differenze tra le implementazioni del compilatore.

Seguendo la sua implementazione vediamo che ci sono diverse macro a seconda del compilatore:

  • __PRETTY_FUNCTION__ - GCC, MetroWerks, Marte digitale, ICC, MinGW
  • __FUNCSIG__ - MSVC
  • __FUNCTION__ - Intel e IBM
  • __FUNC__ - Borland
  • __func__ - ANSI C99
+0

+1 per presentare una soluzione che funziona su più piattaforme –

+2

@Matthieu, grazie Boost per quello :) –

+0

+1. Questa è una soluzione eccellente. Non l'avevo ancora scoperto. –

1

Non in Standard C++ (e __func__ non fa parte di C++). Tuttavia, la tua implementazione potrebbe avere questa caratteristica - quale compilatore stai usando?

+0

Anche io sono interessato a g ++ e MSVC++. – Notinlist

1

Vedere "Predefined Macros (C/C++)" per un elenco completo supportato da MS Visual Studio.

+0

Quel documento vive qui, ora: https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros –

6
  • Su GCC è possibile utilizzare __FUNCTION__ e __PRETTY_FUNCTION__.
  • Su MSVC è possibile utilizzare __FUNCSIG__ e __FUNCTION__.
+0

'__PRETTY_FUNCTION__' è fantastico! Testerà '__FUNCSIG__' più tardi. – Notinlist

3

Non esiste una tale macro in C++ standard e che include la bozza di standard C++ 0x che ho visto. Complicherebbe la compilazione, dato che l'analisi (necessaria per determinare quale funzione è) viene dopo la pre-elaborazione, e sospetto sia per questo che non c'è nulla nello standard.

Il __func__ che si sta utilizzando non è standard, anche se apparentemente funziona sul compilatore.

+0

Questo non ha senso, poiché può inserire una funzione di runtime definita dall'implementazione. Pre-processer La concatenazione delle stringhe sarebbe quindi impossibile ma non è consentita neanche per altri simboli del preprocessore. – Lothar

0

Questo potrebbe essere utile:

http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html

#include"stdio.h" 
#include"stdlib.h" 
int main() 
{ 
printf("line number is %d .. func name is %s, file name is %s",__LINE__,__PRETTY_FUNCTION__,__FILE__); 
return 0; 
} 

Questo è come stampare il numero di riga, nome della funzione e il nome del file in gcc.

Problemi correlati