C ++命名空间可防止冲突,但是如果命名空间本身的名称冲突,该怎么办?示例:
#include <cstdlib>
namespace atoi {
int foo() {return 42;}
}
问题:namespace Atoi
是否可以可靠地避免碰撞?也就是说,C ++是否可以保护我使用诸如Atoi
之类的大小写混合的名称空间?还是像Atoi
这样的混合大小写名称空间名称可能会被将来的C ++标准,技术规范(TS),Boost库,编译器,工具链等践踏?
当然,我并不打算将namespace atoi
或namespace Atoi
用于实用代码。这些仅用于说明(因为atoi
恰好是C标准库使用的名称)。我真正想要的是namespace my
,最好是小写字母,但如果有必要,则最好使用namespace My
。您对atoi
和Atoi
的回答可能会影响我在my
和My
之间的选择。这就是为什么我问。
我注意到Stroustrup更喜欢使用大小写混合的名称空间名称。我还注意到该示例中的示例。 C ++ 17标准的10.3(草稿here)避免使用小写的名称空间名称。
答案 0 :(得分:1)
观看此视频:Standard library compatibility guidelines。蒂图斯·温特斯(Titus Winters)的这段视频说明了标准委员会保留的权利以及您在标准库中不应依赖的内容。
This必须是正式文件。我在视频说明中找到了它。这就是我们所关心的:
标准图书馆自身的权利 保留以下权利:
●在名称空间std中添加新名称
●在名称空间std中的类型中添加新的成员函数
●为现有功能添加新的重载
●在函数和模板中添加新的默认参数
●以兼容的方式更改函数的返回类型(请勿更改为 任何东西,数值类型的扩展等)。
●以将 向后兼容(如果这些接口仅用于实例化) 类型和调用函数。实施细节(的主要名称 类型,可调用函数的实现细节)可能不是 依赖。
○例如,我们可能会更改标准的实施细节 函数模板,使它们成为可调用的函数对象。如果 用户代码仅调用可调用的对象,其行为不变。
答案 1 :(得分:1)
我可以可靠地避免名称空间
Atoi
引起的冲突吗?
完全可靠。 C标准库中没有该名称的标识符。
或者像Atoi这样的混合大小写名称空间名称可能会被将来的C ++标准,技术规范(TS),Boost库,编译器,工具链等践踏吗?
不太可能。
编译器扩展应使用保留的标识符。
新的标准库(包括TS)标识符被添加到std
名称空间(或嵌套在std
中的名称空间)中。 Boost应该将其标识符添加到boost
命名空间中。
例外情况是宏,它在名称空间中不存在。 Boost的命名约定是使用BOOST_
前缀。新的标准库宏应使用保留的标识符。
C标准库当然没有名称空间。新版本可能会添加一个非保留的宏,尽管应将其添加到新的标头中,而该标头将不包含现有程序。
更麻烦的是POSIX标准标头,它添加了很多标识符,C标准没有将这些标识符保留到全局名称空间中。根据所包含的POSIX标头,它会添加quite a few reserved prefixed and suffixes。
使用大写字母后跟小写字母(例如您的Atoi
建议)可以避免与大多数POSIX保留以及大多数标准名称严格遵循所有小写或所有大写字母的用法(通常用于宏)冲突)。
为尽量减少名称冲突,这是我的经验法则。一定要遵循,有些仅仅是指导原则: