Domanda

Ho una libreria che ho creato,

mylib.c:

#include <mylib.h>
int
testlib() {
    printf("Hello world\n");
    return (0);
}

mylib.h:

#include <stdio.h>
extern int testlib();

Nel mio programma, ho tentato di chiamare questa funzione della libreria:

myprogram.c:

#include <mylib.h>

int
main (int argc, char *argv[]) {
    testlib();
    return (0);
}

Quando provo a compilare questo programma ottengo il seguente errore:

In file included from myprogram.c:1
mylib.h:2 warning: function declaration isn't a prototype

Sto utilizzando: gcc (GCC) 3.4.5 20051201 (Red Hat 3.4.5-2)

La mia domanda è, qual è il modo corretto di dichiarare un prototipo di funzione?

È stato utile?

Soluzione

In C int foo() e int foo(void) sono diverse funzioni. int foo() accetta un numero arbitrario di argomenti, mentre int foo(void) accetta 0 argomenti.In C++ significano la stessa cosa.Suggerisco di usare void in modo coerente quando si intende senza argomenti.

Se si dispone di una variabile a, extern int a; è un modo per dire al compilatore che a è un simbolo che potrebbe essere presente in una diversa unità di traduzione (compilatore C parlare anche per file di origine), non risolvere il problema fino al tempo di collegamento.D'altra parte, i simboli, che sono i nomi delle funzioni sono comunque risolti in fase di collegamento.Il significato di una classe di archiviazione di identificatore di una funzione (extern, static) interessa solo la sua visibilità e extern è l'impostazione predefinita, in modo extern in realtà è inutile.

Ho suggeriamo di rimuovere la extern, è estraneo e di solito è omesso.

Altri suggerimenti

Risposta rapida:cambiare int testlib() per int testlib(void) per specificare che la funzione non accetta argomenti.

Un prototipo è, per definizione, una dichiarazione di funzione che specifica il tipo(s) della funzione dell'argomento(s).

Un non-prototipo dichiarazione di funzione come

int foo();

è una dichiarazione di stile che non specifica il numero o il tipo di argomenti.(Prima del 1989 ANSI C standard, questo era l'unico tipo di dichiarazione di funzione disponibili in lingua). È possibile chiamare una funzione con qualsiasi numero arbitrario di argomenti, e il compilatore non è tenuto a reclamare -- ma se la chiamata è in contrasto con l' definizione, il programma ha un comportamento indefinito.

Per una funzione che accetta uno o più argomenti, è possibile specificare il tipo di ogni argomento nella dichiarazione:

int bar(int x, double y);

Funzioni senza argomenti sono un caso speciale.Logicamente, le parentesi vuote sarebbe stato un buon modo per specificare che un argomento ma che la sintassi era già in uso per il vecchio stile di dichiarazioni di funzione, in modo che il ANSI C comitato inventato una nuova sintassi che utilizza il void parola chiave:

int foo(void); /* foo takes no arguments */

Una funzione definizione (che include il codice per la funzione fa) fornisce anche un dichiarazione.Nel tuo caso, hai qualcosa di simile a:

int testlib()
{
    /* code that implements testlib */
}

Questo fornisce un non-prototipo dichiarazione per testlib.Come definizione, questo indica al compilatore che testlib non ha parametri, ma come una dichiarazione in cui si indica solo il compilatore che testlib prende alcuni specificato, ma fissa il numero e il tipo(s) di argomenti.

Se si modifica () per (void) la dichiarazione diventa un prototipo.

Il vantaggio di un prototipo, è che se per sbaglio si chiama testlib con uno o più argomenti, il compilatore è in grado di diagnosticare l'errore.

(C++ è leggermente diverso.C++ non sono vecchio stile dichiarazioni di funzione, e le parentesi vuote in particolare significa che una funzione non accetta argomenti.C++ supporta l' (void) la sintassi per coerenza con la C.Ma se non è in particolare necessario che il codice per compilare sia come C e C++, probabilmente si dovrebbe usare il () in C++ e (void) la sintassi del C.)

Provare:

extern int testlib(void);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top