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
?
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.
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