大小写混合名称空间冲突

时间:2019-03-09 15:32:46

标签: c++ namespaces

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

#include <cstdlib>

namespace atoi {
    int foo() {return 42;}
}

问题:namespace Atoi是否可以可靠地避免碰撞?也就是说,C ++是否可以保护我使用诸如Atoi之类的大小写混合的名称空间?还是像Atoi这样的混合大小写名称空间名称可能会被将来的C ++标准,技术规范(TS),Boost库,编译器,工具链等践踏?

当然,我并不打算将namespace atoinamespace Atoi用于实用代码。这些仅用于说明(因为atoi恰好是C标准库使用的名称)。我真正想要的是namespace my,最好是小写字母,但如果有必要,则最好使用namespace My。您对atoiAtoi的回答可能会影响我在myMy之间的选择。这就是为什么我问。

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

另请参阅this related question.

2 个答案:

答案 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保留以及大多数标准名称严格遵循所有小写或所有大写字母的用法(通常用于宏)冲突)。


为尽量减少名称冲突,这是我的经验法则。一定要遵循,有些仅仅是指导原则:

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