C++ 大小写混合的命名空间名称冲突

C++ 大小写混合的命名空间名称冲突,c++,namespaces,C++,Namespaces,C++名称空间可以防止冲突,但是如果名称空间本身的名称发生冲突怎么办?例如: #include <cstdlib> namespace atoi { int foo() {return 42;} } #包括 名称空间原子{ int foo(){return 42;} } 问题:我能否通过名称空间Atoi可靠地避免冲突?也就是说,C++保护我是否使用混合的名称空间名称,比如 Atoi < /代码>?还是混合的名称空间名称,如 Atoi ,可能会被未来的C++标准、技术规范

C++名称空间可以防止冲突,但是如果名称空间本身的名称发生冲突怎么办?例如:

#include <cstdlib>

namespace atoi {
    int foo() {return 42;}
}
#包括
名称空间原子{
int foo(){return 42;}
}
问题:我能否通过
名称空间Atoi
可靠地避免冲突?也就是说,C++保护我是否使用混合的名称空间名称,比如<代码> Atoi < /代码>?还是混合的名称空间名称,如<代码> Atoi <代码>,可能会被未来的C++标准、技术规范(TS)、升压库、编译器、工具链等? 当然,对于实用代码,我并不打算使用
namespace-atoi
namespace-atoi
。这些只是为了说明(因为
atoi
恰好是C标准库使用的名称)。我真正想要的是
名称空间我的
,最好是小写,但如果必要,可以混合使用
名称空间我的
。您关于
atoi
atoi
的回答可能会影响我在
my
my
之间的选择。这就是为什么我要问

我注意到Stroustrup更喜欢大小写混合的名称空间名称。我还注意到第节中的例子。C++17标准(草案)的10.3避免使用小写名称空间名称

另请参见

观看此视频:。此视频由Titus Winters提供,其中说明了标准委员会保留的权利以及标准库中不应依赖的内容

必须是官方文件。我在视频的描述中找到了它。这就是我们关心的问题:

标准库为其自身保留的权利主要是标准 保留以下权利:

●向命名空间添加新名称​性病

●向命名空间中的类型添加新成员函数​性病

●向现有函数添加新重载

●向函数和模板添加新的默认参数

●以兼容的方式更改函数的返回类型(void为 任何内容、数字类型等)

●对现有接口进行更改,以使 backwardcompatible,如果这些接口仅用于实例化 类型和调用函数。实施详细信息(项目的主要名称) 类型,则函数的实现细节(可调用)可能不可用 取决于

○例如,我们可能会更改标准的实现细节 functiontemplates,使其成为可调用的函数对象。如果 用户代码只显示可调用的,行为不变

我能否通过命名空间
Atoi
可靠地避免冲突

相当可靠。在C标准库中没有该名称的标识符

或是混合的名称空间名称,如Atoi,可能被未来的C++标准、技术规范(TS)、升压库、编译器、工具链等(? 不太可能

编译器扩展应该使用保留标识符

新的标准库(包括TS)标识符添加到
std
命名空间(或嵌套在
std
中的命名空间)中。Boost应该将其标识符添加到
Boost
名称空间中

一个例外是宏,它不存在于名称空间中。Boost命名约定是使用
Boost\uu
前缀。新的标准库宏应使用保留标识符

C标准库当然没有名称空间。一个新版本可能会添加一个非保留宏,尽管它应该被添加到一个新的头中,而这个头是预先存在的程序不会包含的

更麻烦的是POSIX标准头,它在全局名称空间中添加了许多标识符,这些标识符不是C标准保留的。它会根据包含的POSIX头进行添加

使用大写字母后跟小写字母,如您的
Atoi
建议,可以避免与大多数POSIX保留以及大多数严格遵循全小写或全大写约定(通常用于宏)的标准名称发生冲突


为了尽量减少名称冲突,以下是我的经验法则。有些应该明确遵守,有些只是指导方针:

  • 永远不要使用标准保留的标识符,即使是在名称空间内
  • 避免使用宏。
    • 命名宏时使用一致的前缀
  • 仅全局声明一个命名空间,而不声明其他全局标识符。
    • 声明该命名空间内的所有其他内容
  • 在所有项目中共享相同的全局命名空间。
    • 不一定适用于通用的、可重用的库
    • 使用子名称空间可以避免项目之间的冲突
    • 使用子命名空间可以避免项目中的冲突
  • 命名全局标识符(即全局名称空间或宏)时,避免使用POSIX标准保留的名称

C++中的任何符号都是区分大小写的,我认为这不会在将来的任何标准中发生变化。Titus Winters的这段视频说明了标准委员会在标准库中保留的权利以及您不应该依赖的内容。@πάνταῥεῖ 谢谢你澄清这个问题。未来的C标准库(或Boost库等)可能会将
my
引入C++的全局名称空间。然而,未来的C标准库(或Boost库等)是否会将混合大小写的
My
引入C++的全局名称空间?@Someprogrammerdude标准并不保证
atoi
不在全局名称空间中,除了
std
。您可以通过对Unicode进行自由调整来避免这个问题<代码>名称空间ảt̉ỏỉ{(Ducks.Runs.)。除了视频链接,你应该引用他在你的答案中所说的内容(至少是与问题相关的重要部分)。这里的答案应该尽可能独立。给我一个小时@πάν