GCC mit -std=c99 beschwert sich darüber, nicht zu wissen, struct timespec
Wenn ich versuche zu kompilieren unter Linux mit gcc -std=c99
, der compiler beschwert sich darüber, nicht zu wissen struct timespec
. Aber wenn ich kompilieren Sie diese ohne -std=c99
funktioniert alles einwandfrei.
#include <time.h>
int main(void)
{
struct timespec asdf;
return 0;
}
Warum ist das so und gibt es eine Möglichkeit, noch get it to work mit -std=c99
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Explizit aktivieren der POSIX-Funktionen
Den timespec kommt von POSIX, so haben Sie zu 'aktivieren' POSIX-Definitionen:
Den vers an der Spitze ist, was ich derzeit verwenden - es löst die Definitionen aus der Single UNIX Specification (SUS) auf der Basis, ob Sie einen C99 oder C89 compiler.
_XOPEN_SOURCE 700
_XOPEN_SOURCE 600
_XOPEN_SOURCE 500
Wie bereits angemerkt in den Kommentaren, mit
_XOPEN_SOURCE
strikt ermöglicht die XSI (X/Open System Interface) Erweiterungen über POSIX, aber es ist sehr selten für Sie zu wollen, POSIX und nicht XSI. Sie sollten in der Regel geben Sie_XOPEN_SOURCE
und nicht futz mit_POSIX_C_SOURCE
. Siehe POSIX (2018) auf Die Zusammenstellung Umgebung für weitere Informationen über die Funktion von Makros.Für meine Systeme im Jahr 2010, POSIX 2008 war nicht so weit verbreitet, wie POSIX-2004, so dass ' s was ich benutzt habe - aber YMMV. Beachten Sie, dass SUS v3 und v4 beide erfordern C99 Zusammenstellung. Auf Solaris, mindestens, mit C89 gescheitert.
GCC bietet
-std=gnuXX
OptionenWenn Sie angeben
-std=c11
zu GCC (oder Clang Emulation GCC), dann wird nur der standard-C-Definitionen werden aktiviert. Wenn Sie-std=gnu11
, dann von POSIX-und anderen Erweiterungen zu standard C sind standardmäßig sichtbar.Beachten Sie, dass GCC 4.x und früher verwendet
-std=gnu90
(entsprechend C90 plus Erweiterungen) standardmäßig. GCC-5.x und höher verwenden-std=gnu11
standardmäßig. Es gab nie eine version von GCC, die aktiviert-std=gnu99
standardmäßig.Verwenden ein header-control der version POSIX-Informationen
Ich jetzt (2019) verwenden einen header zu Kapseln dieser Informationen, so dass zukünftige änderungen erfordern nur die änderung eines einzelnen headers, nicht jeder Quellcode-Datei, die verwendet POSIX-Funktionen. Es war schmerzhaft, die Bearbeitung der alten Strophe, die aus mehreren Quelldateien als die Zeit verging und POSIX 2008 wurde verbreitet.
Können Sie die Informationen aus diesen header ohne Namensnennung und copyright-Vermerk der Regel erforderlich, die durch die "CC-by-sa-3.0" - Lizenz von Stack Overflow. Dieser code steht in meinem SOQ (Stack-Overflow Fragen) - repository auf GitHub als Datei
posixver.h
im src/libsoq sub-directory._POSIX_C_SOURCE
auf die richtigen Werte, wenn Sie nur wollen, POSIX._XOPEN_SOURCE
ist für XSI-Erweiterungen._XOPEN_SOURCE
bringt in einige nützliche Dinge im Vergleich zu_POSIX_C_SOURCE
zum Beispiel strdup(), strptime(), srandom(), realpath(), lockf () und einige Unterstützung für große Dateien-Zeug.Ich würde empfehlen, das kompilieren mit
-std=gnu99
.Erarbeiten auf dieser. Standardmäßig gcc kompiliert mit -std=gnu89. Hier sind die Ergebnisse für die folgenden source-code.
gnu89
mitc99
, das ist, warum der Fehler Auftritt, und zeigt, dass der gleiche Fehler entsteht, mitc89
. Ist es sinnvoll, Ergänzende Informationen.