
compilador
Pensé que la diferencia es que declaration
no tiene tipos de parámetros…
¿Por qué funciona esto?
int fuc();
int fuc(int i) {
printf("%d", i);
return 0;
}
pero esto falla al compilar:
int fuc();
int fuc(float f) {
printf("%f", f);
return 0;
}
con el mensaje:
error: tipos en conflicto para ‘fuc’. nota: un tipo de argumento que tiene una promoción predeterminada no puede coincidir con una declaración de lista de nombres de parámetros vacía

ataúd de jerry
Una declaración:
int f();
… le dice al compilador que algún identificador (f
en este caso) nombra una función y le dice el tipo de retorno de la función, pero no no especificar el número o tipo(s) de parámetro(s) que la función pretende recibir.
Un prototipo:
int f(int, char);
…es por lo demás similar, pero también especifica el número/tipo de parámetro(s) que la función debe recibir. Si no toma ningún parámetro, usa algo como int f(void)
para especificar eso (ya que dejar los paréntesis vacíos es una declaración). Una definición de función de nuevo estilo:
int f(int a, char b) {
// do stuff here...
}
…también actúa como un prototipo.
Sin un prototipo en el ámbito, el compilador aplica promociones predeterminadas a los argumentos antes de llamar a la función. Esto significa que cualquier char
o short
ascendió a int
y cualquier float
es ascendido a double
. Por lo tanto, si declara (en lugar de prototipo) una función, no no quiero especificar alguna char
, short
o float
parámetro: llamar a tal cosa daría/dará un comportamiento indefinido. Con banderas predeterminadas, el compilador bien puede rechazar el código, ya que básicamente no hay forma de usarlo correctamente. Es posible que pueda encontrar algún conjunto de indicadores del compilador que le permitan aceptar el código, pero sería bastante inútil, ya que no puede usarlo de todos modos…
prototipo = declaración directa, para que pueda usarla antes de decirle al compilador lo que hace. Todavía tiene parámetros, sin embargo.
¡Útil en muchos aspectos!

mu es demasiado corto
los declaración int fuc(float);
le dice al compilador que existe una función fuc
que toma un float
y devuelve un int
.
los definición int fuc(float f) { /*...*/ }
le dice al compilador qué fuc
en realidad es y también proporciona la declaración también.
La diferencia entre una declaración y una definición es la diferencia entre decir que existe un sombrero azul talla 6 y entregarle a alguien un sombrero azul talla 6: la declaración dice que existe tal cosa, la definición dice que esta cosa aquí es la cosa en cuestión.
¿Qué dice el compilador cuando falla al compilar el segundo ejemplo?
– xappymah
30 de marzo de 2011 a las 3:39
@xappymah, de gcc
error: conflicting types for ‘fuc’. note: an argument type that has a default promotion can’t match an empty parameter name list declaration
– John LaRooy
30 de marzo de 2011 a las 5:05
Relacionado: stackoverflow.com/questions/12643202/…
– Ciro Santilli Путлер Капут 六四事
25 de abril de 2016 a las 9:09