【发布时间】:2015-10-23 11:03:15
【问题描述】:
math.h 中的宏 DOMAIN 与枚举和可能的其他类型发生冲突。我不知道该怎么做。
#include <algorithm>
enum Type { DOMAIN };
int main(){
Type t = Type::DOMAIN;
return 0;
}
使用标志 -std=c++11 编译。不过,这段代码的 C99 版本编译得非常好:
#include <algorithm>
enum Type { DOMAIN };
int main(){
Type t = DOMAIN;
return 0;
}
我检查了源代码,库是罪魁祸首。算法包括stl_algo.h,其中有ifdef:
#if __cplusplus >= 201103L
#include <random> // for std::uniform_int_distribution
#include <functional> // for std::bind
#endif
以下代码在 c++11 编译器上编译良好:
#include <random>
#include <iostream>
int main(){
std::cout << DOMAIN << std::endl;
return 0;
}
这是功能还是错误?
EDIT* 脏修复:
#ifdef DOMAIN
#undef DOMAIN
#endif
【问题讨论】:
-
DOMAIN宏?这是从哪里来的?我在 C++1z 和 C11 草案中都找不到它.. -
嗯。它似乎与 System V Unix 的
matherr函数有关,而不是 C 或 C++。设置了__USE_MISC宏(参见glibc 的features.h);否则math.h不会定义DOMAIN宏。有可能进入_ISOC11_SOURCE模式以停用_DEFAULT_SOURCE以摆脱__USE_MISC。 -- 编辑:...它似乎比这更复杂