ich benutzte #ifdef Win32
für sichere Anrufe gleichermaßen sprintf_s
aber jetzt möchte ich ein Projekt mit MinGW bauen und es ist jetzt einfach falsch. Ich muss verwenden #ifdef VC++
oder irgendwie so. Ist es möglich?
Wie #ifdef nach CompilerType ? GCC oder VC++
Aniket Inge
#ifdef __clang__
/*code specific to clang compiler*/
#elif __GNUC__
/*code for GNU C compiler */
#elif _MSC_VER
/*usually has the version number in _MSC_VER*/
/*code specific to MSVC compiler*/
#elif __BORLANDC__
/*code specific to borland compilers*/
#elif __MINGW32__
/*code specific to mingw compilers*/
#endif
-
__GNUC__
ist ein Sprachdialekt, kein Compiler. Die meisten Compiler (einschließlich Clang und ICC) definieren__GNUC__
zumindest manchmal.– Quuxplusone
13. August 2017 um 21:35 Uhr
-
@Quuxplusone
__GNUC__
ist ein Sprachdialekt, aber der Code, den Sie schreiben, ist normalerweise für den Compiler und hoffentlich für Menschen. Wenn Sie jedoch meinten, dass ich diese Antwort durch Ändern verbessern muss/* code for GNU C compiler */
zu/* code in GNU C Dialect */
Anschließend können Sie einen Verbesserungsvorschlag einreichen– Aniket Inge
14. August 2017 um 5:18 Uhr
-
Ich weise nur darauf hin, dass, wenn das OP versucht hat, GCC von VC++ von “einem anderen Compiler, der auch GNU C unterstützt” (z. B. ICC, Clang, Green Hills, …) zu unterscheiden, dann überprüft wird
__GNUC__
wäre nicht ausreichend. In diesem Fall würde diese Frage/Antwort besser zu ihrer Situation passen.– Quuxplusone
14. August 2017 um 5:23 Uhr
-
FYI auf macos, clang definiert das gcc-Flag, also müssen Sie etwas zusätzliche Logik wie: #if GNUC #ifndef klirren #pragma GCC-Diagnosewarnung “-Wclass-memaccess” #endif #endif
– Koboldhack
14. August 2019 um 15:56 Uhr
-
Ah – ich sehe, Sie haben Clang an die erste Stelle gesetzt und so das Problem der Clang-Aktivierung vermieden GNUC Hübsch
– Koboldhack
14. August 2019 um 16:15 Uhr
Siehe die Tabelle “Microsoft-spezifische vordefinierte Makros” von Visual C vordefinierte Makros
Sie könnten nachsehen _MSC_VER
.
autistisch
Vorzugsweise sollten Sie auf tragbare Symbole zurückgreifen. Ich verstehe, dass diese Symbole manchmal nicht definiert sind, also können Sie das sehen Predef-Projekt für eine umfangreiche Liste von Präprozessor-Makros zu Standards, Compilern, Bibliotheken, Betriebssystemen und Architekturen, die sind nicht tragbar.
Die Funktion, die Sie in dieser Frage ausdrücklich erwähnen, wurde jedoch als Teil des C11-Standards aufgenommen Anhang K.3, die Bounds-Checking Interfaces (Bibliothek).
K.3.1.1p2 Zustände:
Die in K.3 und seinen Unterabschnitten deklarierten oder definierten Funktionen, Makros und Typen werden durch ihre jeweiligen Header deklariert und definiert, wenn
__STDC_WANT_LIB_EXT1__
ist als Makro definiert, das an der Stelle in der Quelldatei, an der der entsprechende Header zuerst enthalten ist, zur Ganzzahlkonstante 1 erweitert wird
Daher sollten Sie der Überprüfung den Vorzug geben __STDC_WANT_LIB_EXT1__
und verwenden Sie nur compilerspezifische Symbole, wenn diese nicht vorhanden sind.
-
Nett. Noch nie von dem Link gehört, danke fürs Posten.
– Ron Burk
28. Februar 2013 um 5:02 Uhr
Nebenbei könntest du einfach verwenden
snprintf()
Dies ist eine Standardfunktion, die dasselbe tut.– Fataler Fehler
28. Februar 2013 um 4:32 Uhr
@FatalError Nicht in Visual C++, tut es nicht; Leider gibt es nur C89-Unterstützung, und
snprintf
wurde nicht garantiert, dass es in C89 existiert. Es gibt ähnliches_snprintf
obwohl IIRC nicht umbenannt wurdesnprintf
denn das macht etwas subtil anderes.– autistisch
27. April 2015 um 21:08 Uhr