Mingw中预处理器G 的奇怪行为
Strange behavior of the preprocessor g++ in MinGW
我有代码:
#if _MSC_VER <= 1300
float round(float f)
{
if (f < 0)
return ceilf (f - 0.5);
else
return floorf (f + 0.5);
}
#endif
上面的行应仅在旧版本的Visual C 编译器中进行编译。我将此代码与mingw compiller组合在一起。那里没有这样的符号,例如_msc_ver,它代码不必编译,因为表达式#if _MSC_VER <= 1300
必须等于false。但是,它编译了。有人可以解释我为什么会发生吗?
Mingw中的编译为GNU 6.3.0。
好吧,在G _MSC_VER
上未定义,如您所指出的,它是视觉C 特定的。
您可以尝试添加以下内容:
#ifdef _MSC_VER
#if _MSC_VER <= 1300
// Your code
#endif
#endif
另外,如果我正在阅读C 标准,则未定义的标识符被0替换,因此它会通过您的条件和编译,就好像您使用了"古老的Visual C "。
摘录摘自 16.1条件包含:
由于宏扩展和定义的一元操作员,所有替换均已替换 已经执行了所有剩余的标识符和关键字,除了真和错误,都将替换 使用pp-number 0,然后将每个预处理令牌转换为令牌。
如果未定义 _MSC_VER
,则编译器将不会从 #if
到包括 #endif
中看到任何代码。
根据上下文,编译器将看到有效的源代码,并成功编译。请放心,您的round
版本将不会构成编译程序的一部分,尽管std::round
可能已隐式包含在某个地方。
最后,使用0.5
的添加剂常数来设计round
功能存在故障。请参阅为什么很多(旧程序)使用地板(0.5 输入)而不是回合(输入)?
相关文章:
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- Visual Studio C - 无法输出预处理文件
- 在海湾合作委员会中加快宏观预处理的任何方法
- Xmllint未设置,而在路径中找不到XMLLINT;跳过XML预处理
- 当头文件被预处理时是否有一个预处理器选项显示?