我曾经使用#ifdef Win32
来实现类似sprintf_s
的安全调用,但现在我想使用MinGW构建项目,这种方法不再适用了。我需要使用#ifdef VC++
或类似的方法。这可能吗?
我曾经使用#ifdef Win32
来实现类似sprintf_s
的安全调用,但现在我想使用MinGW构建项目,这种方法不再适用了。我需要使用#ifdef VC++
或类似的方法。这可能吗?
#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
__GNUC__
是一种语言方言,而不是编译器。大多数编译器(包括Clang和ICC)有时都会定义__GNUC__
。 - Quuxplusone__GNUC__
是一种语言方言,但你编写的代码通常是为编译器和人类而设计的。然而,如果你的意思是让我通过将 /* code for GNU C compiler */
更改为 /* code in GNU C Dialect */
来改进这个答案,那么你可以提交一个改进提案。 - Aniket Inge__GNUC__
将是不够的。在这种情况下,这个问题/答案更适合他们的情况。 - Quuxplusone最好使用可移植符号。我知道有时这些符号可能没有定义,因此您可以查看Predef project以获取有关标准、编译器、库、操作系统和不可移植架构的预处理器宏的广泛列表。
但是,您在此问题中特别提到的函数已经作为Annex K.3,边界检查接口(库)的一部分包含在C11标准中。
K.3.1.1p2指出:
因此,您应优先检查如果在源文件中适当的头文件首次被包含的地方,将
__STDC_WANT_LIB_EXT1__
定义为扩展到整数常量1的宏,则在其各自的头文件中声明或定义K.3及其子条款中声明和定义的函数、宏和类型。
__STDC_WANT_LIB_EXT1__
,仅在不存在时使用特定于编译器的符号。
snprintf()
函数,它是一个标准函数,可以完成相同的任务。 - FatalErrorsnprintf
在C89中并不保证存在。有类似的_snprintf
,但我记得它没有被重命名为snprintf
,因为它执行的操作略有不同。 - autistic