Wie #ifdef nach CompilerType ? GCC oder VC++

Lesezeit: 3 Minuten

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?

  • 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 _snprintfobwohl IIRC nicht umbenannt wurde snprintf denn das macht etwas subtil anderes.

    – autistisch

    27. April 2015 um 21:08 Uhr

Benutzer-Avatar
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.

Benutzer-Avatar
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

1344260cookie-checkWie #ifdef nach CompilerType ? GCC oder VC++

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy