2012-09-02 23 views
9

Mi compilador (gcc) lanza advertencias (no errores!) En la línea que declara fp:no puede interpretar Advertencia del compilador

int fd = open("filename.dat", O_RDONLY); 
FILE* fp = fdopen(fd, "r"); // get a file pointer fp from the file descriptor fd 

Estas son las advertencias:

main.c: In function ‘main’: 
main.c:606: warning: implicit declaration of function ‘fdopen’ 
main.c:606: warning: initialization makes pointer from integer without a cast 

que no entiende estas advertencias ya que el valor de retorno de fopen es FILE*. ¿Cuál es el error que estoy cometiendo aquí?

EDIT: Estoy incluyendo stdio.h (y también estoy en Linux).

+3

¿Qué estás '# include'-ing? – robert

+0

@ Robert: stdio.h, stdlib.h, string.h, errno.h, unistd.h, sys/types.h, sys/stat.h, fcntl.h – pap42

+0

¿Tiene 'hombre fdopen' enumerar las cabeceras que se no tienes? – robert

Respuesta

11

Respuesta corta: utilizar -std=gnu99 al compilar, el estándar habitual es no POSIX y no tiene fdopen.


warning: implicit declaration of function ‘fdopen’ 

significa que se han olvidado de incluir el archivo de cabecera que la declaración de fdopen() reside en A continuación se presenta una declaración implícita por el compilador -. Y eso significa que el valor de retorno de la función desconocida se supone que ser int - por lo tanto, la segunda advertencia. Tienes que escribir

#include <stdio.h> 

Editar: si se incluyen adecuadamente stdio.h, entonces fdopen() no estén disponibles en el sistema de orientación. ¿Estás en Windows? Esta función es solo POSIX.

Editar 2: Lo siento, realmente debería haber percibido esto. C99 significa el estándar ANSI C99, y el estándar C no fuerza el concepto de descriptores de archivos para admitir sistemas que no sean POSIX, por lo que solo proporciona fopen(). fdopen() está relacionado con los descriptores de archivos, por lo que es solo POSIX, por lo que no forma parte del C99 estándar. Si utiliza el modificador -std=gnu99 para GCC, se deshace de las restricciones de la norma y permite las extensiones POSIX y GNU, solucionando esencialmente su problema.

+1

Lo siento, olvidé mencionar que ** estoy ** incluido 'stdio.h' (ver edición). – pap42

+1

@ pap42 es posible que esté usando Windows. Si ese es el caso, le sugiero que cese y desista. –

+1

Estoy en Linux, en realidad. – pap42

2

No está incluyendo #include <stdio.h> en C, por lo que el compilador "adivina" la declaración de la función que está tratando de llamar. (Tomando los parámetros que has basado y usando int como valor de retorno). Por lo general, no desea tales conjeturas, por lo tanto, el compilador le advierte.

Solución: Añada #include s.

+0

Lo siento, pero esta respuesta es incorrecta. Estoy incluyendo 'stdio.h' (ver edición). – pap42

+0

¿En qué sistema estás? - POSIX dice 'fdopen()' tiene que estar en 'stdio.h' (o en un encabezado incluido por stdio.h) - http://pubs.opengroup.org/onlinepubs/007908775/xsh/fdopen.html – johannes

+0

I Estoy en Linux (y estoy igualmente desconcertado por esta advertencia ya que estoy incluyendo 'stdio.h'). – pap42

0

La función fdopen no es parte del estándar C y no está disponible como parte de los encabezados estándar si se compila en el modo C estándar. Entonces, o necesita usar -std=gnu99 en lugar de -std=c99 para compilar su fuente o declarar la función usted mismo.

0

Hay una buena explicación para el compilador de diagnóstico en la respuesta de @ H2CO3, así que vamos solo se ve en la qué de las cosas: si está utilizando glibc (y probablemente lo están), ciertas funciones POSIX pueden requerir característica específica Probar macros para mostrar.

En particular, es posible que tenga que poner la siguiente línea:

#define _POSIX_SOURCE 
// or #define _XOPEN_SOURCE 

antes

#include <stdio.h> 

Algunos compiladores (como gcc) también tienen opciones de línea de comandos en el mismo sentido (todo el gnu* opciones de estándares en gcc).

+1

Esto es correcto en principio, pero '_POSIX_SOURCE' es de la versión obsoleta de principios de los 90 de la norma POSIX. El nombre moderno es '_POSIX_C_SOURCE' y no se puede definir simplemente a una definición en blanco; tiene que definirse a la versión que desee. '200809L' es el valor correcto para el estándar actual. –

1
#define _XOPEN_SOURCE 600 
#include <stdio.h> 

Esto se ajusta a la perfección con estricta c99

gcc -std=c99 -pedantic -Wall -Wextra -Werror 
Cuestiones relacionadas