2012-01-15 14 views
15

Sto leggendo un vecchio libro su offuscamento del codice in C (il libro è stato stampato nel 1993), e ho notato che le funzioni con argomenti sono implementate in questo modo:Definendo il tipo di argomento della funzione dopo ")", è uno standard molto vecchio?

real_dump(address, infunc, ofp) 
char *address; 
int (*infunc)(); 
FILE *ofp; 
{ 
    /* the code goes here... */ 
} 

Inoltre, nessun tipo di ritorno è definito.

È un vecchio standard? È possibile abilitare gcc per compilare questo codice?

+10

Questa sintassi era vecchia anche nel 1993 :) – dasblinkenlight

+1

Penso che il compilatore in bundle con HP-UX supporti solo questo anche sui sistemi moderni.Il compilatore ANSI C costa denaro aggiuntivo. Quindi se hai bisogno di compilare un programma C molto semplice, conoscere questa sintassi può effettivamente essere utile. –

+0

Nel 1993, non era irragionevole usare quella vecchia sintassi; c'erano ancora macchine in cui i compilatori nativi non supportavano la Standard C. Non molti, ma ce n'erano alcuni. Non è stato fino agli anni '90 (dal 1996 in poi) che i prototipi erano sufficientemente universali da poter essere utilizzati automaticamente. Vicino al confine, ma nel 1993, ancora giustificabile (anche se ci sarebbe dovuto essere un chiarimento da qualche parte nel libro). –

risposta

19

Le definizioni di funzione nel modulo non prototipo sono codici C89, C99 e C11 validi.

Si chiama definizione della funzione vecchio stile ma questa funzione è contrassegnata dal C89 come funzione obsoleta.

Questo modulo deve essere non utilizzato nei nuovi programmi.

C99 Razionale dice:

"che caratterizza il vecchio stile come obsoleto è destinato a scoraggiare suo uso e per servire come una forte approvazione da parte del Comitato delle nuovo stile".

anche K & R2 scoraggia il suo utilizzo:

"Il vecchio stile di dichiarazione e la definizione funziona ancora con ANSI C, almeno per un periodo di transizione, ma si consiglia vivamente di utilizzare il nuovo modulo quando hai un compilatore che lo supporta. "

Ora anche la funzione non ha un tipo di ritorno e omettendo il tipo di ritorno in una dichiarazione di funzione o in una definizione di funzione non è più valida dal C99. Prima di C99, le funzioni senza un tipo restituito restituivano implicitamente un int.

Per quanto riguarda la domanda gcc, per impostazione predefinita gcc compila con -std=gnu89. Significa C89 Standard + estensioni gcc. Quindi, per impostazione predefinita, gcc accetterà di compilare un programma con la dichiarazione e la definizione delle funzioni nel loro formato vecchio stile e senza un tipo di ritorno.

9

Ouch, questo era il modo pre-ANSI C per definire le funzioni, in realtà non è consigliabile utilizzare questo tipo di sintassi nel codice "normale". Tuttavia, gcc sembra accettarlo senza problemi (è ancora nello standard, anche se contrassegnato come "obsoleto" in §6.11.7).

(a proposito, come per il ritorno "dispersi" digitare il "int regola implicita" dovrebbero applicare)

+2

+1 per "ouch". Non c'è davvero nessuna scusa per usare più K & R C ... –

2

La mancanza di tipo restituito significa che il tipo di ritorno è int. Questo è il default.

4

Questa è la dichiarazione di stile della funzione Kernighan e Ritchie. K & R C preceduto ANSI C, che ha aggiunto i prototipi di funzione in stile C++ che sono più comunemente utilizzati ora.

Problemi correlati