GCC avec-std=c99 se plaint de ne pas connaître struct timespec

quand j'essaie de compiler cela sur Linux avec gcc -std=c99 , le compilateur se plaint de ne pas savoir struct timespec . Cependant, si je compilais cela sans -std=c99 , tout fonctionnerait très bien.

#include <time.h>

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

Pourquoi est-ce et y a-t-il un moyen de le faire fonctionner avec -std=c99 ?

35
demandé sur jww 2010-10-06 21:20:00

2 réponses

le timespec vient de POSIX, vous devez donc 'activer' les définitions 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;
}

le standard au sommet est ce que j'utilise actuellement - il déclenche les définitions de la spécification UNIX simple (SUS) basée sur le fait que vous utilisez un compilateur C99 ou C89.

  • si vous voulez le POSIX 2008 (SUS v4) matériel, utilisez _XOPEN_SOURCE 700
  • si vous voulez le POSIX 2004 (SUS v3) material, use XOPEN_SOURCE 600
  • si vous voulez le POSIX 1995 (SUS v2, 1997) matériel, utilisez _XOPEN_SOURCE 500

pour mes systèmes, POSIX 2008 n'est pas aussi largement disponible que 2004, donc c'est ce que j'utilise - mais YMMV. Il est à noter que les versions v3 et v4 de SUS nécessitent toutes deux une compilation C99. Sur Solaris, au moins, utiliser C89 échouera.

50
répondu Jonathan Leffler 2010-10-06 17:35:07

je recommande de compiler avec -std=gnu99 .

pour en savoir plus. 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
41
répondu Bill Lynch 2010-10-06 17:22:57