GCC avec -std=c99 se plaint de ne pas savoir struct timespec
Quand j'essaie de le compiler sur Linux avec 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
?
Vous devez vous connecter pour publier un commentaire.
Activer explicitement POSIX caractéristiques
La timespec vient de POSIX, donc, vous avez à "activer" POSIX définitions:
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.
_XOPEN_SOURCE 700
_XOPEN_SOURCE 600
_XOPEN_SOURCE 500
Comme indiqué dans les commentaires, à l'aide de
_XOPEN_SOURCE
strictement permet XSI (X/Open System Interface) des extensions plus stricte POSIX, mais il est très rare que vous souhaitez POSIX et pas XSI. Normalement vous devriez le préciser_XOPEN_SOURCE
et pas futz avec_POSIX_C_SOURCE
. Voir POSIX (2018) sur L'Environnement De Compilation pour plus d'informations sur la fonctionnalité de macros.Pour mes systèmes en 2010, POSIX 2008 n'était pas aussi largement disponible que POSIX 2004, de sorte que c'est ce que j'ai utilisé - mais YMMV. Notez que SUS v3 et v4, les deux nécessitent C99 compilation. Sur Solaris, au moins, à l'aide de C89 échoué.
GCC fournit
-std=gnuXX
optionsSi vous spécifiez
-std=c11
pour GCC (ou Clang émulation de GCC), alors que la norme C définitions sont activés. Si vous utilisez-std=gnu11
, puis POSIX et d'autres extensions de la norme C sont visibles par défaut.Noter que GCC 4.x et antérieures utilisé
-std=gnu90
(correspondant à C90 plus des extensions) par défaut. GCC 5.x et de les utiliser plus tard-std=gnu11
par défaut. Il n'a jamais été une version de GCC qui a permis-std=gnu99
par défaut.Utiliser un en-tête de contrôle de la version POSIX information
J'ai maintenant (2019) l'utilisation d'un en-tête pour encapsuler l'information, de sorte qu'à l'avenir les changements ne demandent que le changement d'un seul en-tête, et non à chaque fichier source qui utilise des fonctionnalités POSIX. C'était douloureux de l'édition de l'ancienne strophe de plusieurs fichiers source comme le temps passait et POSIX 2008 est devenue prédominante.
Vous pouvez utiliser les informations de cette tête, sans la mention de la source et de l'avis de droit d'auteur exige normalement le "CC by-sa 3.0" licence utilisée par Débordement de la Pile. Ce code est disponible dans mon OSQ (Débordement de Pile Questions) dépôt sur GitHub en tant que fichier
posixver.h
dans le src/libsoq sous-répertoire._POSIX_C_SOURCE
pour les valeurs correctes si vous voulez juste POSIX._XOPEN_SOURCE
est pour XSI extensions._XOPEN_SOURCE
n'apporter quelques trucs utiles par rapport à_POSIX_C_SOURCE
, par exemple strdup(), strptime(), srandom(), la fonction realpath(), lockf(), et certains fichiers de taille importante des trucs.Je recommanderais de la compilation avec
-std=gnu99
.À insister sur ce point. Par défaut, gcc compile avec -std=gnu89. Voici les résultats pour le code source suivant.
gnu89
avecc99
, qui est pourquoi le message d'erreur survient, et montre que la même erreur se produit avecc89
. Il est des informations supplémentaires utiles.