44 votes

Linux: avec gcc -std=c99 se plaint de ne pas savoir struct timespec

Quand j'essaie de le compiler sur Linux avec des gcc -std=c99, le compilateur se plaint de ne pas savoir struct timespec. Cependant, si je compile sans -std=c99 tout fonctionne bien.

#include <time.h>

int main(void)
{
  struct timespec asdf;
  return 0;
}

Pourquoi est-ce et est-il un moyen de toujours obtenir de travailler avec -std=c99?

62voto

Jonathan Leffler Points 299946

Le timespec vient de POSIX, donc, vous avez à "activer" POSIX définitions:

#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 strophe en haut est ce que j'utilise actuellement -, il déclenche les définitions de la Single UNIX Specification (SUS), selon que vous utilisez à l'aide d'un C99 ou C89 compilateur.

  • Si vous voulez la POSIX 2008 SUS (v4) le matériel, l'utilisation _XOPEN_SOURCE 700
  • Si vous voulez la POSIX 2004 SUS (v3) le matériel, l'utilisation _XOPEN_SOURCE 600
  • Si vous voulez la POSIX 1995 SUS (v2, 1997), utiliser _XOPEN_SOURCE 500

Pour mes systèmes POSIX 2008 n'est pas aussi largement disponible que 2004, de sorte que c'est ce que j'utilise mais YMMV. Notez que SUS v3 et v4, les deux nécessitent C99 compilation. Sur Solaris, au moins, à l'aide de C89 échouera.

40voto

sharth Points 25625

Je recommanderais de la compilation avec -std=gnu99.

Pour revenir sur ce point. Par défaut, gcc compile avec -std=gnu89. Voici les résultats pour le code source suivant.

#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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X