291 votes

Quelle est la différence entre __PRETTY_FUNCTION__, __FUNCTION__, __func__?

Quelle est la différence entre __PRETTY_FUNCTION__ , __FUNCTION__ , __func__ et où sont-ils documentés? Comment puis-je décider lequel utiliser?

343voto

James McNellis Points 193607

__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éclaration

static 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."

18voto

sashang Points 4548

__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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X