2009-12-13 11 views
7

En Solaris, gcc me dadeclaración getopt implícita en Solaris?

declaración implícita de la función `getopt'

al compilar

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

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

El man page para getopt dice algo acerca de la inclusión o unistd.h stdio. h, sin embargo, aunque estoy incluyendo ambos todavía recibo esta advertencia. ¿Esto es normal? ¿Está utilizando funciones que no se declaran explícitamente comunes en el desarrollo de Unix?

+1

¿Cómo la compila? –

+0

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

+0

@Steven ¿Qué significa "grep getopt /usr/include/*.h"? – Scooter

Respuesta

1

La página man dice incluir stdio.h, no stdlib.h. ¿Incluye el problema stdio.h solucionar el problema?

+0

No, actualizaré la pregunta al reflext que – Steven

+0

En lugar de --ansi, y siempre que quiera ser explícito sobre el estándar, se puede usar -std = standard. Por ejemplo: -std = gnu90 compila sin advertencias y es la configuración predeterminada en este momento (cuando se omite -std). –

9

Está compilando con -ansi, y en ese modo getopt podría no estar disponible, ya que -ansi implica el modo conformes C89. Intente quitar ese interruptor o #define _GNU_SOURCE antes de #include <unistd.h>. getopt() es POSIX, no ANSI.

Editar: Probablemente no necesite _GNU_SOURCE. De acuerdo con this, usted debe ser capaz de obtener la funcionalidad con la definición de macros del preprocesador de tal manera que esto es cierto:

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

Ver this para obtener más información sobre las macros de prueba de funciones.

+0

eliminando -ansi de hecho elimina la advertencia. Sin embargo, me pregunto por qué getopt() no cumple con C89 cuando ninguna otra función POSIX que he usado no daba ninguna advertencia #define _GNU_SOURCE aunque no (esto es Solaris) – Steven

+0

Ver mi edición. C89 no define getopt: por lo que sería incorrecto que glibc lo exponga al compilar en modo C89. Aunque, como se ha declarado en unistd.h, que no existe en C89, quizás glibc pueda hacer esto, no estoy seguro. –

1

Uso gnu99 resueltos por mí:

gcc -std=gnu99 file.c 

Esto es con unistd.h.

Cuestiones relacionadas