time_t how c posix c99 timespec

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