Quelle est la différence entre __PRETTY_FUNCTION__
, __FUNCTION__
, __func__
et où sont-ils documentés? Comment puis-je décider lequel utiliser?
Réponses
Trop de publicités?__func__
est déclarée implicitement identificateur qui se développe à un tableau de caractères de la variable contenant le nom de la fonction, lorsqu'il est utilisé à l'intérieur d'une fonction. Il a été ajouté à C en C99. De C99 §6.4.2.2/1:
L'identificateur
__func__
est implicitement déclarée par le traducteur comme si, immédiatement après l'accolade d'ouverture de chaque définition de fonction, la déclarationstatic const char __func__[] = "function-name";
est apparu, où la fonction est le nom de la lexicalement-fonction englobante. Ce nom est sans fioritures nom de la fonction.
Notez qu'il n'est pas une macro et il n'a pas de signification particulière lors du pré-traitement.
__func__
a été ajouté à C++ en C++11, où il est spécifié en tant que contenant "une mise en œuvre chaîne définie par l'" (C++11 §8.4.1[dcl.fct.def.général]/8), qui n'est pas aussi utile que la spécification dans C. (l'original de La proposition visant à ajouter l' __func__
de C++ a été N1642).
__FUNCTION__
est un pré-extension standard que certains compilateurs C (y compris le gcc et Visual C++); en général, vous devez utiliser __func__
où il est pris en charge et ne l'utiliser __FUNCTION__
si vous utilisez un compilateur qui ne prend pas en charge (par exemple, Visual C++, qui ne prend pas en charge le C99 et ne prend pas encore en charge l'ensemble de C++0x, ne fournit pas d' __func__
).
__PRETTY_FUNCTION__
est un gcc extension qui est presque le même que l' __FUNCTION__
, sauf pour les fonctions C++ il contient le "joli" nom de la fonction, y compris la signature de la fonction. Visual C++ est similaire (mais pas identique) extension, __FUNCSIG__
.
Pour les non standard macros, vous aurez envie de consulter votre compilateur de la documentation. Le Visual C++ extensions sont inclus dans la documentation MSDN de le compilateur C++ de "Macros Prédéfinies". La gcc documentation extensions sont décrites dans le ccag page de documentation "les Noms de Fonction en tant que Chaînes."
__func__
est documenté dans le C++0x standard à l'article 8.4.1. Dans ce cas, c'est une fonction prédéfinie variable locale de la forme:
static const char __func__[] = "function-name ";
lorsque la fonction "nom" est la mise en œuvre spécifique. Cela signifie que chaque fois que vous déclarez une fonction, le compilateur va ajouter cette variable implicitement à votre fonction. La même chose est vraie de l' __FUNCTION__
et __PRETTY_FUNCTION__
. En dépit de leur uppercasing, ils ne sont pas les macros. Bien qu' __func__
est une extension de C++0x
g++ -std=c++98 ....
sera toujours compiler du code en utilisant __func__
.
__PRETTY_FUNCTION__
et __FUNCTION__
sont documentées ici http://gcc.gnu.org/onlinedocs/gcc-4.5.1/gcc/Function-Names.html#Function-Names. __FUNCTION__
est juste un autre nom pour l' __func__
. __PRETTY_FUNCTION__
est le même que __func__
en C, mais en C++, il contient le type ainsi que la signature.