2009-12-13 17 views
7

In Solaris, gcc mi dàgetopt dichiarazione implicita in Solaris?

implicita dichiarazione di funzione `getopt'

durante la compilazione

#include <unistd.h> 
#include <stdlib.h> 

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

Il man page per getopt dice qualcosa su come includere unistd.h o stdio. h, tuttavia, anche se sto includendo entrambi, ricevo comunque questo avviso. È normale? Sta usando funzioni che non sono esplicitamente dichiarate comuni nello sviluppo di Unix?

+1

Come lo compili? –

+0

Sto compilando con gcc -ansi -pedantic -Wall – Steven

+0

@Steven Cosa restituisce "grep getopt /usr/include/*.h"? – Scooter

risposta

1

La pagina man dice di includere stdio.h, non stdlib.h. Comprende il stdio.h risolvere il problema?

+0

No, aggiornerò la domanda per riflettere che – Steven

+0

Invece di --ansi, e se si desidera essere espliciti sullo standard, è possibile utilizzare -std = standard. Ad esempio: -std = gnu90 compila senza alcun avviso ed è l'impostazione predefinita al momento (quando ometto -std). –

9

Si sta compilando con -ansi e in tale modalità getopt potrebbe non essere disponibile, poiché -ansi implica la modalità conforme C89. Prova a rimuovere l'interruttore o #define _GNU_SOURCE prima del #include <unistd.h>. getopt() è POSIX, non ANSI.

Modifica: Probabilmente non è necessario _GNU_SOURCE. Secondo this, si dovrebbe essere in grado di ottenere la funzionalità di definire macro del preprocessore in modo tale che questo è vero:

#if _POSIX_C_SOURCE >= 2 || _XOPEN_SOURCE || _POSIX_SOURCE 

Vedi this per ulteriori informazioni sulle macro funzione di test.

+0

rimozione -ansi effettivamente rimuove l'avviso. Tuttavia, mi chiedo perché getopt() non sia conforme a C89 quando ogni altra funzione POSIX che ho usato non ha dato alcun avviso #define _GNU_SOURCE non però (questo è Solaris) – Steven

+0

Vedere la mia modifica. C89 non definisce getopt: quindi sarebbe scorretto per glibc esporlo durante la compilazione in modalità C89. Anche se, dato che è dichiarato in unistd.h, che non esiste in C89, forse glibc può farlo, non ne sono sicuro. –

1

Uso gnu99 risolti per me:

gcc -std=gnu99 file.c 

Questo è con unistd.h.

Problemi correlati