Pourquoi la taille d’une fonction dans C est-elle toujours de 1 octet?

Lorsque nous vérifions la taille d’une fonction en utilisant sizeof() , nous obtenons toujours 1 octet . Que signifie ce 1 octet?

C’est une violation de contrainte et votre compilateur doit le diagnostiquer. Si elle le comstack malgré cela, votre programme a un comportement indéfini [merci à @Steve Jessop pour la clarification du mode de défaillance, et voyez la réponse de @Michael Burr pour savoir pourquoi certains compilateurs le permettent]: De C11, 6.5.3.4./ 1:

L’opérateur sizeof ne doit pas être appliqué à une expression ayant un type de fonction

Ce comportement n’est pas indéfini – la norme du langage C nécessite un diagnostic lors de l’utilisation de l’opérateur sizeof avec un sizeof de fonction (un nom de fonction) car il s’agit d’une violation de contrainte pour l’opérateur sizeof .

Cependant, en tant qu’extension du langage C, GCC autorise l’arithmétique sur les pointeurs de void et les pointeurs de fonction, en traitant la taille d’un void ou d’une fonction de 1 . En conséquence, l’opérateur sizeof sera évalué à 1 pour le void ou à une fonction avec GCC. Voir http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html#Pointer-Arith

Vous pouvez demander à GCC d’émettre un avertissement lors de l’utilisation de sizeof avec ces opérandes en utilisant les -pedantic ou -Wpointer-arith de GCC. Ou en faire une erreur avec -Werror=pointer-arith .

Cela signifie que l’auteur du compilateur a choisi une valeur de 1 plutôt que de faire voler des démons de votre nez (en fait, c’est une autre utilisation indéfinie de sizeof qui nous a donné cette expression: le compilateur C lui-même DOIT émettre un diagnostic SI diagnostic nécessaire résultant de votre programme, puis PEUT provoquer lui-même un vol de démons (ce qui pourrait d’ailleurs être le message de diagnostic documenté), tout comme il PEUT émettre d’autres diagnostics pour d’autres violations des règles de syntaxe ou des contraintes (ou , d’ailleurs, pour toute raison qu’elle choisit). ” https://groups.google.com/forum/?fromgroups=#!msg/comp.std.c/ycpVKxTZkgw/S2hHdTbv4d8J

De là, il y a le terme d’argot “démons nasaux” pour tout ce qu’un compilateur décide de faire en réponse à une construction indéfinie. 1 est le démon nasal de ce compilateur pour ce cas.

Comme d’autres l’ont fait remarquer, sizeof () peut prendre n’importe quel identifiant valide, mais il ne renverra pas un résultat valide (un honnêtement vrai et valide) pour les noms de fonction. De plus, cela peut certainement entraîner ou non un syndrome de «démons hors du nez».

Si vous voulez définir la taille de la fonction de votre programme, consultez la carte de l’éditeur de liens, qui se trouve dans le répertoire des résultats intermédiaires (celui où les éléments sont compilés dans .obj / .o ou où l’image / le fichier exécutable obtenu). Parfois, il y a une option pour générer ou non ce fichier map … il dépend du compilateur / éditeur de liens.

Si vous voulez la taille d’un pointeur sur une fonction, elles ont toutes la même taille, la taille d’un mot d’adressage sur votre processeur.