C和C++有许多不同之处,并非所有有效的C代码都是有效的C++代码.
("有效"是指具有已定义行为的标准代码,即不是特定于实现/未定义/等.)
在使用每种语言的标准编译器编译时,是否有任何一种在C和C++中都有效的代码会产生不同的行为?
为了使它成为一个合理/有用的比较(我试图学习一些实用的东西,而不是试图在问题中找到明显的漏洞),让我们假设:
#ifdef __cplusplus,pragma等) 在查找NaN运行我的代码的优化版本(编译g++ 4.8.2和4.9.3)时,一切都变为s 的错误,我发现问题是-Ofast选项,特别是-ffinite-math-only它包含的标志.
代码的一部分涉及从FILE*使用中读取浮点数fscanf,然后用NaN数值替换所有s.然而,正如可以预料的那样,-ffinite-math-only开始并删除这些检查,从而离开了NaNs.
在试图解决这个问题,我迷迷糊糊uppon 这个,这表明添加-fno-finite-math-only的方法属性禁用特定方法的优化.以下说明了问题和尝试修复(实际上没有修复它):
#include <cstdio>
#include <cmath>
__attribute__((optimize("-fno-finite-math-only")))
void replaceNaN(float * arr, int size, float newValue){
for(int i = 0; i < size; i++) if (std::isnan(arr[i])) arr[i] = newValue;
}
int main(void){
const size_t cnt = 10;
float val[cnt];
for(int i = 0; i < cnt; i++) scanf("%f", val + i);
replaceNaN(val, cnt, -1.0f); …Run Code Online (Sandbox Code Playgroud)