Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何按编译器类型定义ifdef?GCC或VC++;_C_Conditional Compilation - Fatal编程技术网

如何按编译器类型定义ifdef?GCC或VC++;

如何按编译器类型定义ifdef?GCC或VC++;,c,conditional-compilation,C,Conditional Compilation,我曾使用#ifdef Win32进行类似于sprintf_s的安全调用,但现在我想用MinGW构建项目,但现在它错了。我需要使用#ifdef VC++或类似的方法。有可能吗?请参阅“Microsoft特定预定义宏”表 您可以检查MSC\u VER最好使用便携式符号。我知道有时这些符号可能没有定义,因此您可以查看有关标准、编译器、库、操作系统和不可移植架构的大量预处理器宏的列表 #ifdef __clang__ /*code specific to clang compiler*/ #elif _

我曾使用
#ifdef Win32
进行类似于
sprintf_s
的安全调用,但现在我想用MinGW构建项目,但现在它错了。我需要使用
#ifdef VC++
或类似的方法。有可能吗?

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


您可以检查MSC\u VER

最好使用便携式符号。我知道有时这些符号可能没有定义,因此您可以查看有关标准、编译器、库、操作系统和不可移植架构的大量预处理器宏的列表

#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
但是,您在本问题中特别提到的功能已包含在C11标准中,作为其一部分

国家:

如果
\uuu STDC\u WANT\u LIB\u EXT1\uuu
被定义为在源文件中首先包含相应头的点处扩展为整数常量1的宏,则在K.3及其子类中声明或定义的函数、宏和类型由各自的头声明和定义


因此,您应该优先检查“代码>”、“StdCyWaTyLIbBeExt11} < /C++”,并且仅在不存在的时候使用编译器特定的符号。遗憾的是,只有C89支持,

snprintf
不能保证在C89中存在。还有类似的
\u snprintf
,尽管IIRC没有被重命名为
snprintf
,因为它做了一些微妙的不同。以前从未听说过这个链接,谢谢你发布。
\uuu GNUC\uuu
是一种语言方言,而不是编译器。大多数编译器(包括Clang和ICC)至少有时会定义
\uuuuu GNUC\uuuuu
。@Quuxplusone
\uuuuuuu GNUC\uuuuu
是一种语言方言,但您编写的代码通常是针对编译器的,希望是针对人类的。但是,如果您的意思是我必须通过将GNU C编译器的
/*代码*/
更改为GNU C方言的
/*代码*/
来改进这个答案,那么您可以提交一份改进建议,只需指出,如果OP试图将GCC与VC++区别开来,“其他一些同样支持GNU C的编译器”(例如ICC、Clang、Green Hills等)然后检查
\uu GNUC\uuuuu
是不够的。在这种情况下,.FYI在macos上,Clang定义了gcc标志,因此您需要执行一些额外的逻辑,如:#if GNUC#ifndef Clang#pragma gcc诊断警告“-Wclass memaccess”#endif#endifAh-我看到您将clang放在第一位,从而避免了clang启用GNUC nice的问题