Question 11.3

Il mio compilatore ANSI si lamenta su un disaccordo quando vede

	extern int func(float);

	int func(x)
	float x;
	{ ...


Sono mescolate la dichiarazione di prototipo di nuovo tipo ``extern int func(float);'' con quella di vecchio tipo ``int func(x) float x;''. Di solito mescolare i due stili e` sicuro (vedere doamanda 11.4), ma non in questo caso.

Il vecchio C (e l'ANSI C, in assenza di prototipi, e in liste di argomenti di lunghezza variabile; vedere domanda 15.2) ``allarga'' certi argomenti quando sono passati a funzioni. I float sono promossi a double, e i caratteri e gli interi brevi sono promossi a int. (Per funzioni definizioni vecchio stile, i valori sono automaticamente riconvertiti ai corrispondenti tipi piu` stretti entro il corpo della funzione chiamata, se sono dichiarate in quel modo li`.)

Questo problema puo` essere fixed risolto o usando la sintassi nuovo stile consistentemente nella definizione:

	int func(float x) { ... }

o cambiando la dichiarazione di prototipo nuovo stile per adattare la definizione vecchio stile:

	extern int func(double);
(In questo caso, sarebbe piu` chiaro cambiare anche la definizione vecchio stile per usare double, nella misura in cui l'indirizzo di quel parametro non e` preso.)

Puo` anche essere piu` sicuro evitare del tutto argomenti di funzioni e tipi restituiti ``stretti'' (char, short int, and float).

Vedere anche domanda 1.25.

Riferimenti: K&R1 Sez. A7.1 p. 186
K&R2 Sez. A7.3.2 p. 202
ANSI Sez. 3.3.2.2, Sez. 3.5.4.3
ISO Sez. 6.3.2.2, Sez. 6.5.4.3
Rationale Sez. 3.3.2.2, Sez. 3.5.4.3
H&S Sez. 9.2 pp. 265-7, Sez. 9.4 pp. 272-3


Leggere di seguito: prev prossima su cima


Questa pagina e` di Steve Summit // Copyright 1995 // mail feedback