一些C++里奇奇怪怪的问题
一些C++里奇奇怪怪的问题
这里所谓奇奇怪怪的问题,并非手写代码错误导致的bug,也不是编译器对C++11标准的支持不同而导致的bug,而是由于不同类型、不同版本的编译器行为不同,或者或不同平台下标准头文件的差异而导致的。
一个常见于MSVC的编译期错误
1
2
3
4
5
6
7
#include<iostream>
#include<cmath>
int main(){
std::cout << M_PI << std::endl;
return 0;
}
M_PI 是定义在math.h头文件中的宏,cmath头文件亦会引用math.h头文件。 上述代码在GCC或者Clang中均可直接编译通过,然而在MSVC中会提示无法找到M_PI 的定义。 几经调试,最终发现是
1
2
3
4
5
6
7
8
#define _USE_MATH_DEFINES
#include<cmath>
#include<iostream>
int main(){
std::cout << M_PI << std::endl;
return 0;
}
其中 #define _USE_MATH_DEFINES 宏在math.h中用于判断是否引入M_PI等宏定义。
未完待续。
This post is licensed under CC BY 4.0 by the author.