2010-10-01 10 views
8

En el compilador gcc, sizeof(main), sizeof(printf) y sizeof(scanf) todos son 1. Quiero saber cómo el tamaño de todos estos son 1. ¿Cuál es la lógica detrás de esto?¿Cuál es el tamaño de (main), sizeof (printf), sizeof (scanf)?

+0

duplicado: [lo que hace sizeof (nombre de la función) return?] (http://stackoverflow.com/questions/2666392/what-does-sizeof-function-name-return) –

Respuesta

22

Debido a que el C (99) estándar requiere (§ 6.5.3.4/1)

sizeof El operador no se aplicarán a una expresión que tiene el tipo de función o un tipo incompleto, al nombre entre paréntesis de dicho tipo, o a una expresión que designa un miembro de campo de bit.

por lo que el valor de retorno no tiene sentido. Si necesita el sizeof el puntero de función, utilice

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

vuelve gcc 1 sobre los tipos que el sizeof no tiene sentido (ver 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

Entonces, ¿aplicar sizeof a un tipo de función es un comportamiento indefinido/no especificado? – codymanix

+0

thnx KennyTM ... Pero quiero saber cómo el compilador gcc devuelve 1 ?? – Parikshita

+10

@Parixit: Porque hiciste algo que no tiene sentido, entonces obtienes un resultado que no tiene sentido. Basura dentro basura fuera. Es un comportamiento indefinido, y el compilador puede hacer lo que quiera, incluso formatear su disco duro o prenderle fuego. Pero optó por hacer algo un poco menos dramático, y acaba de regresar 1 – jalf

-1

Hubiera pensado que era del tamaño de un puntero para funcionar. Una realidad que me sorprende ...

+7

Eso debería ser un comentario, no es realmente una respuesta. –

+1

en lugar de respaldar este comentario, la gente debería rechazar la "respuesta" en su lugar. – codymanix

+0

¿Qué pasa con los comentarios? Encuentro que una de las cosas más útiles de la historia es discutir, con otros desarrolladores, qué pensaban. Eliminar eso es, en mi humilde opinión, locura. –