2010-10-01 11 views
8

Nel compilatore gcc, sizeof(main), sizeof(printf) e sizeof(scanf) sono tutti 1. Voglio sapere come sono le dimensioni di tutti questi 1. Qual è la logica dietro di esso?Qual'è la dimensione di (main), sizeof (printf), sizeof (scanf)?

+0

Duplicate: [cosa sizeof (nome della funzione) return?] (http://stackoverflow.com/questions/2666392/what-does-sizeof-function-name-return) –

risposta

22

Perché il C (99) standard richiede (§ 6.5.3.4/1)

L'operatore sizeof non si applicano ad un'espressione che ha tipo di funzione o un tipo incompleto, al nome tra parentesi di un tale tipo, o ad un'espressione che designa un membro bit-field.

quindi il valore restituito è privo di significato. Se avete bisogno di sizeof il puntatore a funzione, utilizzare

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

rendimenti gcc 1 su tipi che il sizeof è priva di senso (vedi 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

Quindi applicare sizeof a un tipo di funzione non è definito/comportamento non specificato? – codymanix

+0

thnx KennyTM ... Ma voglio sapere come restituisce il compilatore gcc 1 ?? – Parikshita

+10

@Parixit: perché hai fatto qualcosa che non ha senso, quindi ottieni un risultato che non ha senso. Immondizia, spazzatura. È un comportamento indefinito, e il compilatore può fare tutto ciò che vuole, inclusa la formattazione del disco rigido o l'accensione dei capelli. Ma ha scelto di fare qualcosa di un po 'meno drammatico, e ha appena restituito 1 – jalf

-1

Avrei pensato che fosse la dimensione di un puntatore a funzionare. Una realtà che mi sorprende ...

+7

Questo dovrebbe essere un commento, non è davvero una risposta. –

+1

invece di invitare questo commento, la gente dovrebbe invece preferire la "risposta". – codymanix

+0

Cosa c'è di sbagliato nei commenti? Trovo che una delle cose più utili di sempre stia discutendo, con altri sviluppatori, su cosa hanno pensato. Eliminare ciò è, IMHO, grossolana follia. –