how - GCC con-std=c99 se queja de no conocer struct timespec
time_t c (2)
Cuando intento compilar esto en Linux con gcc -std=c99
, el compilador se queja de no conocer struct timespec
. Sin embargo, si compilo esto sin -std=c99
todo funciona bien.
#include <time.h>
int main(void)
{
struct timespec asdf;
return 0;
}
¿Por qué es esto y hay una manera de hacerlo funcionar con -std=c99
?
El timespec proviene de POSIX, por lo que debe ''habilitar'' las definiciones de POSIX:
#if __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 600
#else
#define _XOPEN_SOURCE 500
#endif /* __STDC_VERSION__ */
#include <time.h>
void blah(struct timespec asdf)
{
}
int main()
{
struct timespec asdf;
return 0;
}
La estrofa en la parte superior es la que uso actualmente: desencadena las definiciones de Single UNIX Specification (SUS) en función de si está utilizando un compilador C99 o C89.
- Si desea material POSIX 2008 (SUS v4), use _XOPEN_SOURCE 700
- Si desea el material POSIX 2004 (SUS v3), use _XOPEN_SOURCE 600
- Si desea el material POSIX 1995 (SUS v2, 1997), use _XOPEN_SOURCE 500
Para mis sistemas, POSIX 2008 no está tan ampliamente disponible como 2004, así que eso es lo que uso, pero YMMV. Tenga en cuenta que SUS v3 y v4 requieren una compilación C99. En Solaris, al menos, el uso de C89 fallará.
Recomiendo compilar con -std=gnu99
.
Para profundizar en esto. Por defecto, gcc compila con -std = gnu89. Aquí están los resultados para el siguiente código fuente.
#include <time.h>
int main() {
struct timespec asdf;
return 0;
}
[1:25pm][wlynch@cardiff /tmp] gcc -std=gnu89 foo.c
[1:26pm][wlynch@cardiff /tmp] gcc -std=gnu99 foo.c
[1:25pm][wlynch@cardiff /tmp] gcc -std=c89 foo.c
foo.c: In function ‘main’:
foo.c:4: error: storage size of ‘asdf’ isn’t known
[1:26pm][wlynch@cardiff /tmp] gcc -std=c99 foo.c
foo.c: In function ‘main’:
foo.c:4: error: storage size of ‘asdf’ isn’t known