2010-10-01 10 views
8

Dans le compilateur gcc, sizeof(main), sizeof(printf) et sizeof(scanf) sont tous 1. Je veux savoir comment sont les tailles de toutes ces 1. Quelle est la logique derrière cela?Quelle est la taille de (principal), sizeof (printf), sizeof (scanf)?

+0

double: [qu'est-ce que sizeof (nom de la fonction) return?] (http://stackoverflow.com/questions/2666392/what-does-sizeof-function-name-return) –

Répondre

22

Parce que la norme C (99) nécessite (§ 6.5.3.4/1)

L'opérateur sizeof ne doit pas être appliqué à une expression qui a le type de fonction ou un type incomplet, au nom parenthésé d'un tel type, ou à une expression désignant un membre de champ de bits.

donc la valeur de retour est sans signification. Si vous avez besoin du sizeof le pointeur de fonction, utilisez

sizeof(&main) 
sizeof(&printf) 
sizeof(&scanf) 

retours gcc 1 sur les types que le sizeof est vide de sens (voir c-common.c):

4187  if (type_code == FUNCTION_TYPE) 
4188  { 
4189   if (is_sizeof) 
4190   { 
4191    if (complain && (pedantic || warn_pointer_arith)) 
4192    pedwarn (loc, pedantic ? OPT_pedantic : OPT_Wpointer_arith, 
4193      "invalid application of %<sizeof%> to a function type"); 
4194    else if (!complain) 
4195    return error_mark_node; 
4196    value = size_one_node; 
4197   } 
4198   else 
4199   value = size_int (FUNCTION_BOUNDARY/BITS_PER_UNIT); 
4200  } 
4201  else if (type_code == VOID_TYPE || type_code == ERROR_MARK) 
4202  { 
4203   if (type_code == VOID_TYPE 
4204    && complain && (pedantic || warn_pointer_arith)) 
4205   pedwarn (loc, pedantic ? OPT_pedantic : OPT_Wpointer_arith, 
4206     "invalid application of %qs to a void type", op_name); 
4207   else if (!complain) 
4208   return error_mark_node; 
4209   value = size_one_node; 
4210  } 
+0

L'application de sizeof à un type de fonction est donc un comportement indéfini/non spécifié? – codymanix

+0

thnx KennyTM ... Mais je veux savoir comment le compilateur gcc renvoie 1 ?? – Parikshita

+10

@Parixit: Parce que vous avez fait quelque chose qui n'a aucun sens, vous obtenez un résultat qui n'a aucun sens. Garbage in, garbage out. C'est un comportement indéfini, et le compilateur pourrait faire tout ce qu'il veut, y compris le formatage de votre disque dur ou mettre le feu à vos cheveux. Mais il a choisi de faire quelque chose d'un peu moins dramatique, et juste retourné 1 – jalf

-1

J'aurais pensé que c'était la taille d'un pointeur pour fonctionner. On me surprend en fait ...

+7

Cela devrait être un commentaire, ce n'est pas vraiment une réponse. –

+1

au lieu d'upvoting ce commentaire, vous les gens devraient downvote la "réponse" à la place. – codymanix

+0

Qu'est-ce qui ne va pas avec les commentaires? Je trouve que l'une des choses les plus utiles jamais discutées, avec d'autres développeurs, ce qu'ils pensaient. Éliminant c'est, à mon humble avis, la folie brute. –

Questions connexes