fileno, F_LOCK y F_ULOCK no se declaran y no están disponibles cuando agrego std = c99 flag a gcc
Pregunta
Tengo estos encabezados en un código c
#include <stdio.h>
#include <unistd.h>
Todo se compiló bien hasta que agregué el indicador -std = c99 al comando gcc (para habilitar restrict ). Y esto provocó los siguientes errores.
advertencia: declaración implícita de función
fileno
error:
F_LOCK
no declarado (primer uso en esta función)
error: (cada identificador no declarado es reportado solo una vez error: para cada función en la que aparece.)
error:F_ULOCK
no declarado (primer uso en esta función
¿Alguna idea para solucionar estos errores / advertencias?
Solución
Debe indicar a los encabezados que desea las extensiones POSIX. En estos días, uso:
#if __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 600
#else
#define _XOPEN_SOURCE 500
#endif /* __STDC_VERSION__ */
Si estoy compilando con -std = c89
, me da la versión POSIX correcta; si compila con -std = c89
, le da la versión correcta de POSIX. Lo uso en Solaris 9 y 10, MacOS X (10.4.x, 10.5.x), HP-UX 11.x, Linux (RHEL4 y 5, SuSE 9 y 10) y AIX 5.xy 6.x - AFAICR , sin problemas hasta ahora.
Esta estrofa debe aparecer antes de que se incluyan los encabezados del sistema (en su propio encabezado o en cada archivo de origen), o debe lograr el mismo efecto con -D_XOPEN_SOURCE = 600
en el comando del compilador línea, o algún otro mecanismo similar.
Otros consejos
Probar
-std=gnu99
para habilitar todas las extensiones y seguir utilizando las mejoras del lenguaje C99.
Puede intentar -D_BSD_SOURCE para habilitar BSD-isms o -D_SVID_SOURCE para habilitar System-V isms