gpt4 book ai didi

c++ - math.h 宏冲突

转载 作者:可可西里 更新时间:2023-11-01 18:31:27 26 4
gpt4 key购买 nike

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;
}

这是功能还是错误?

编辑* 脏修复:

#ifdef DOMAIN
#undef DOMAIN
#endif

最佳答案

这是一个错误(如果你想大方的话,也可以说是一个“疣”)。

此答案的所有其余部分仅涉及 GCC 和 Gnu 标准 C 库 header 。 man 页面引用是针对 linux 系统的(但我添加了指向 man7.org 的链接)。

DOMAIN 宏来自 math.h 的 System V 支持。 (请参阅 man matherr。)System V 支持通常通过定义 _SVID_SOURCE 功能测试宏来启用(请参阅 man feature_test_macros),但如果 ,它会与大量其他扩展一起启用_GNU_SOURCE 已定义,如果未定义功能测试宏,则默认情况下。

gcc 为 C 程序预定义 _GNU_SOURCE 如果 --std 选项被省略或设置为 gnu##。各种 --std=c## 选项导致定义 __STRICT_ANSI__。因此,使用某些明确的 C 标准编译 C 代码将抑制 System V 扩展。之所以需要这样做,是因为 System V 扩展与标准不兼容,甚至与 Posix 也不兼容,因为它们污染了全局命名空间。 (DOMAIN 只是这种污染的一个例子。)

但是,即使指定了 --std=c++##g++ 也会定义 _GNU_SOURCE,因此 System V 扩展将潜入.(感谢@dyp 提供指向此 libstdc++ FAQ entry. 和此 long and inconclusive discussion from 2001 on the GCC mailing list 的链接)

一个丑陋的解决方法是自己设置功能,然后取消定义 __USE_SVID:

#include <features.h>
#undef __USE_SVID

#include <random>
#include <iostream>

int main(){
std::cout << DOMAIN << std::endl;
return 0;
}

( Live on coliru )

恕我直言,这应该不是必需的。但它就在那里。

关于c++ - math.h 宏冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31751723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com