如何通过CompilerType #ifdef?GCC或VC++

cnd*_*cnd 14 c conditional-compilation

我用于#ifdef Win32安全通话,sprintf_s但现在我想用MinGW建立项目,现在它错了.我需要使用#ifdef VC++或以某种方式.可能吗?

Ani*_*nge 40

#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
Run Code Online (Sandbox Code Playgroud)

  • `__GNUC__` 是一种语言方言,而不是编译器。大多数编译器(包括 Clang 和 ICC)至少有时会定义`__GNUC__`。 (2认同)

aut*_*tic 8

您最好使用便携式符号.我理解有时可能没有定义这些符号,因此您可以看到Predef项目,其中包含有关标准,编译器,库,操作系统和不可移植的体系结构的预处理器宏的广泛列表.

但是,您在此问题中特别提及的功能已作为附件K.3(边界检查接口(库))的一部分包含在C11标准中.

K.3.1.1p2说明:

K.3及其子条款中声明或定义的函数,宏和类型由它们各自的头部声明和定义,如果__STDC_WANT_LIB_EXT1__定义为宏,它在源文件中的点处扩展为整数常量1,其中适当的头是首先包括在内

因此,您应该优先选择检查__STDC_WANT_LIB_EXT1__,并且仅在不存在时使用特定于编译器的符号.


Kev*_*son 6

请参阅Visual C预定义宏的"Microsoft特定预定义宏"表

你可以检查一下_MSC_VER.