22

我曾经#ifdef Win32用于安全呼叫sprintf_s,但现在我想用 MinGW 构建项目,现在只是错了。我需要使用#ifdef VC++或以某种方式使用。是否可以?

4

3 回答 3

50
#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
于 2013-02-28T04:39:07.807 回答
11

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

你可以检查一下_MSC_VER

于 2013-02-28T04:35:50.190 回答
8

最好是使用可移植符号。我知道有时这些符号可能未定义,因此您可以查看Predef 项目以获取有关标准、编译器、库、操作系统和不可移植的体系结构的预处理器宏的广泛列表。

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

K.3.1.1p2状态:

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

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

于 2013-02-28T04:54:53.293 回答