gpt4 book ai didi

c++ - 为什么包含 会导致在全局命名空间中定义 div 函数?

转载 作者:行者123 更新时间:2023-12-05 08:45:24 25 4
gpt4 key购买 nike

考虑以下代码块:

void foo(){
int a = div(1,2);
}

这通常不会编译,因为 div函数尚未声明。但是,如果我在代码前面加上 #include <map> ,代码编译。为什么是map将标识符引入全局命名空间,以及为什么 div具体功能?有没有办法避免这种情况?

[mcve]

#include <map>

void foo(){
int a = div(1,2);
}

int main()
{
foo();
}

实时链接 - https://godbolt.org/z/Ye8rv4MTc

clang - <source>:4:7: error: no viable conversion from 'div_t' to 'int'

海湾合作委员会-<source>:4:11: error: 'div' was not declared in this scope

MSVC - <source>(4): error C2440: 'initializing': cannot convert from 'div_t' to 'int'

最佳答案

允许任何 C++ 标准库头文件包含任何其他 C++ 标准库头文件。

其中一个 header 是 <cstdlib> ,这是 <stdlib.h> 的 C++ 版本C 标准库头文件,它声明函数 div_t div(int, int) .

C 标准库头文件的 C++ 版本通常在 std 中声明所有实体。命名空间。然而,该标准允许实现允许他们首先在全局命名空间中声明实体,然后将它们导入到 std 中。通过 using 命名空间声明。

因此,如果您完全包含任何 C++ 标准库 header ,您必须期望 C 标准库中的任何实体都可以在全局命名空间中声明。 div_t div(int, int) 就是其中之一。

然而,所有这些都是未指定的行为。不能保证 div_t div(int, int)如果您只包含 std ,将被声明(在全局命名空间或 <map> 中) .

如果名称与您要自己声明的某些实体冲突,解决方案是将您自己的所有内容(main 除外)放入您自己的命名空间。通过这种方式,名称查找将更喜欢您在命名空间内的声明,而不是全局命名空间中它之外的声明。无论如何都应该这样做。全局命名空间中存在许多潜在的陷阱,特别是因为其中有许多额外的保留标识符、名称、签名等。

关于c++ - 为什么包含 <map> 会导致在全局命名空间中定义 div 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72953003/

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