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

我使用#ifdef Win32来安全调用sprintf_s但现在我想用MinGW构建项目,现在它错了。 我需要使用#ifdef VC++或者某种方式。 可能吗?

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

你可以检查_MSC_VER

 #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 

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

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

K.3.1.1p2规定:

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

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