2013-02-28 15 views
11

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++

+2

Als Neben, könnten Sie einfach 'snprintf()' verwenden, die eine Standardfunktion ist, die das gleiche tut. – FatalError

+0

@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

Antwort

6

finden Sie in der "Microsoft-Specific Vordefinierte Makros" Tabelle der Visual C predefined macros

Sie für _MSC_VER überprüfen konnten.

31
#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 
+1

'__GNUC__' ist ein Sprachdialekt, kein Compiler. Die meisten Compiler (Clang und ICC enthalten) definieren "__GNUC__" zumindest manchmal. – Quuxplusone

+0

@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 –

+0

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

8

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 __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

sind also

Sie Präferenz __STDC_WANT_LIB_EXT1__ beim Einchecken, und nur Compiler spezifischen Symbole verwenden, wenn diese vorhanden ist platzieren sollen nicht.

+1

Schön. Ich habe noch nie von diesem Link gehört, danke für die Veröffentlichung. –

Verwandte Themen