Ich habe #ifdef Win32
für sichere Anrufe wie sprintf_s
verwendet, aber jetzt möchte ich ein Projekt mit MinGW erstellen und es ist jetzt einfach falsch. Ich muss #ifdef VC++
oder irgendwie so verwenden. Ist es möglich?Wie #ifdef von CompilerType? GCC oder VC++
Antwort
finden Sie in der "Microsoft-Specific Vordefinierte Makros" Tabelle der Visual C predefined macros
Sie für _MSC_VER
überprüfen konnten.
#ifdef __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 (Clang und ICC enthalten) definieren "__GNUC__" zumindest manchmal. – Quuxplusone
@Quuxplusone '__GNUC__' ist ein Sprachdialekt, aber der Code, den Sie schreiben, ist normalerweise für den Compiler und hoffentlich Menschen. Wenn Sie jedoch meinen, dass ich diese Antwort verbessern muss, indem ich '/ * Code für GNU C Compiler * /' zu '/ * Code in GNU C Dialekt * /' dann ändere, können Sie einen Verbesserungsvorschlag einreichen –
Wenn das OP versuchte, GCC von VC++ von "irgendeinem anderen Compiler zu unterscheiden, der auch GNU C unterstützt" (zB ICC, Clang, Green Hills, ...), wäre die Überprüfung von "__GNUC__" nicht ausreichend. In diesem Fall würde [diese Frage/Antwort besser zu ihrer Situation passen] (https://stackoverflow.com/a/28166605/1424877). – Quuxplusone
Vorzugsweise sollten Sie auf tragbare Symbole zurückgreifen. Ich verstehe manchmal diese Symbole möglicherweise nicht definiert, so dass Sie die Predef project für eine umfangreiche Liste von Preprocessor-Makros in Bezug auf Standards, Compiler, Bibliotheken, Betriebssysteme und Architekturen sehen können, die sind nicht portable.
Die Funktion, die Sie in dieser Frage speziell erwähnen, wurde jedoch als Teil von Annex K.3, the bounds-checking interfaces (library) in den C11-Standard aufgenommen.
K.3.1.1p2 Zustände:
Die Funktionen, Makros und Typen in K.3 und dessen Unterabschnitten erklärt oder definiert sind, erklärt und durch ihre jeweiligen Header definiert, wenn
sind also__STDC_WANT_LIB_EXT1__
als Makro definiert ist, die auf die ganze Zahl erweitert konstante 1 an der Stelle in der Quelldatei, in der die entsprechenden Header enthielt ersten
Sie Präferenz __STDC_WANT_LIB_EXT1__
beim Einchecken, und nur Compiler spezifischen Symbole verwenden, wenn diese vorhanden ist platzieren sollen nicht.
Schön. Ich habe noch nie von diesem Link gehört, danke für die Veröffentlichung. –
- 1. VC++ # Importanweisung für GCC/G ++
- 2. GCC entspricht dem Fließkomma-Modellschalter von VC?
- 3. Portieren von VC++ SetWaitableTimer auf gcc
- 4. Warum kann ich #ifdef stdafx.h nicht #ifdef?
- 5. Detect Compiler mit #ifdef
- 6. Wie fügt man eine 'oder' Bedingung in #ifdef ein
- 7. #ifdef für 32-Bit-Plattform
- 8. Wie folgt Befehl von VC++?
- 9. Wie Downgrade von VC++ 2010-Projekt auf VC++ 2008?
- 10. Standard #ifdef für Cygwin
- 11. Separate spezifische #ifdef Zweige
- 12. Zweck von `#ifdef MODUL` um module_exit()?
- 13. Transformation von VC++
- 14. Lesen von RichTextBox in VC++
- 15. Entspricht der Syntax von #ifdef in protobuf
- 16. #ifdef DEBUG versus #if DEBUG
- 17. wie Eingang charset gesetzt in VB.net oder VC++. Net
- 18. Python Äquivalent für #ifdef DEBUG
- 19. vC++ (sqlite) wie zu distingush Anweisung ist SELECT - oder nicht?
- 20. Wie VC++ intrinsische Funktionen ohne Laufzeitbibliothek verwenden
- 21. Boolesch in ifdef: ist "#ifdef A && B" das gleiche wie "#if definiert (A) & & definiert (B)"? diese
- 22. Taktzyklus mit GCC
- 23. Fehler beim Kompilieren von rtmpd in VC++
- 24. Aufruf von GCC als "cc" gegen "gcc"
- 25. Zugang #ifdef Code in Eclipse
- 26. MS VC++ wie DLL ohne vc redist erstellen
- 27. Wie kann ich den GCC-Präprozessor überprüfen, ob ein Ausdruck einen Wert oder nichts auswertet?
- 28. Sind die Standard-GCC-Compiler-Optionen gcc-versionsspezifisch oder betriebssystemspezifisch oder beides?
- 29. Visual Studio: Ifdef-Blöcke ausblenden
- 30. Compilerfehler in inaktivem #ifdef Block
Als Neben, könnten Sie einfach 'snprintf()' verwenden, die eine Standardfunktion ist, die das gleiche tut. – FatalError
@FatalError Nicht in Visual C++, tut es nicht; Leider gibt es nur C89-Unterstützung, und 'snprintf' wurde in C89 nicht garantiert. Es gibt das ähnliche '_snprintf', obwohl IIRC nicht in' snprintf' umbenannt wurde, weil das etwas subtil anders macht. – Sebivor