Newsgroup: it.comp.lang.c
Titolo: Sui prototipi di funzione.

Ciao.
Il mio compilatore, Borland C++ Builder 5.5, se scrivo un programma su 
un solo file e non indico esplicitamente i prototipi di funzione, non mi 
segnala alcun problema ed esegue correttamente i programmi.
Volevo sapere se questo comportamento è parte dello standard ANSI C 
oppure no.
Se non sono stato chiaro, ditemelo e posterò un programma con prototipo 
commentato che funziona correttamente.
Un saluto e grazie a tutti per il prezioso aiuto che mi date.
Bizio.

 oppure no.
La definizione di una funzione e` anche una dichiarazione come 
prototipo, ma se vi sono chiamate alla funzione prima della sua 
definizione dovrebbe dare warning.
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

 commentato che funziona correttamente.
Postalo pure.
Ciao
Note:
[1] I prototipi sono nati nel C++ dove erano e sono obbligatori - 
un'imposizione dovuta anche le caratteristiche stesse del linguaggio 
(e.g. function overloading). L'ANSI C adotto' i prototipi ma doveva 
mantenere la compatibilita' con il passato: l'obbigatorieta' dei 
prototipi avrebbe fatto diventare 'illegale' gran parte del codice 
esistente.
[2] In C99 sono pero' obbligatori i prototipi negli "standard headers" 
(per intendersi: gli headers delle librerie standard del compilatore).
[3] Esempi di dichiarazione di funzioni (validi in ANSI C):
int pippo();      /* semplice dichiarazione (senza prototipo) */
int pluto(int n); /* dichiarazione con prototipo */
/* definizione di funz. con prototipo nella dichiarazione */
int paperino(int n)
{   return n;
}
/* definizione con dichiarazione 'old style' (senza prototipo) */
int topolino(n)
int n;
{   return n;
}
/* definizione di funzione implicitamente dichiarata
come: int minnie(); - vietata dal C99 */
minnie()
{   return 10;
}
[4] ma vedi anche C99 6.5.2.2
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

 oppure no.
Se la funzione e la sua definizione sono posti prima del main, nel C++
la stessa definizione viene usata anche per il prototipo.
In C questo non è possibile in quanto ogni funzione deve avere il 
prototipo definito.

 prototipo definito.
Con "prima del main" intendo che deve trovarsi all'inizio del file
e prima delle funzioni che la utilizzano, ovviamente.

 prototipo definito.
Se la funzione e la sua definizione sono posti prima della sua 
utilizzazione (chiamata) anche in C la definizione diventa prototipo.


 prototipo definito.
No. Per chiarezza provo a riassumere, per punti, il mio post di risposta
precedente: mi sembra in apparente contrasto con il tuo.
1) I prototipi non sono obbligatori in C (salvo alcune eccezioni che non 
fanno la regola).
2) La definizione di una funzione e' anche una dichiarazione.
3) Una funzione, che nella definizione ha un prototipo, e' quindi anche 
'dichiarata' con quel prototipo (vd. punto 2).
4) Non e' obbligatorio mettere il prototipo nella "dichiarazione" di una 
funzione.
5) Non e' obbligatorio mettere il prototipo nella "definizione" di una 
funzione.
6) E' diventato obbligatorio dichiarare una funzione solo con l'ultimo 
standard C99 (ma vedi il punto 4)
...se vuoi, dimmi in quale di questi punti non ti trovo d'accordo.
Ciao


 
Io mi rifaccio SOLO allo standard...e penso che sia questo che conta e 
non il resto che sono solo non ufficiali.

AlterX ha scritto:

???


Scusate...
Evidentemente sono piů ignorante di quanto pensassi, perchč le vostre 
risposte mi hanno fatto accorgere di alcune sottigliezze che finora non 
avevo notato. 
Pertanto vorrei chiedervi di spiegare piů in dettaglio la differenza che 
c'č tra definizione, dichiarazione e prototipo.
Un saluto cordiale e grazie mille per l'aiuto che mi date.
Bizio.

 trovi 
l'ultima versione 'draft' del C99.
[2] Infatti, se usi un solo file sorgente C, e sei bravo a definire le 
funzioni in ordine di utilizzo, non hai bisogno di una loro ulteriore 
dichiarazione all'inizio del file.
[3] Default argument promotion: per tipi interi viene effettuata la 
"integer promotion", mentre i float sono promossi a double - C99 6.5.2.2 
/ 6.7.5.3 p15
