Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该做些什么来帮助管理链接器名称空间污染WRT内部使用类吗?_C++ - Fatal编程技术网

C++ 我应该做些什么来帮助管理链接器名称空间污染WRT内部使用类吗?

C++ 我应该做些什么来帮助管理链接器名称空间污染WRT内部使用类吗?,c++,C++,在一个复杂的库或框架中,显然有时纯粹在内部需要类来实现更高级别的功能 通常,这些内部构件与内部构件的工作方式紧密耦合,因此向用户提供它们是没有意义的——他们所能做的就是试图篡改您的私有内部构件 同时,这些东西中的一些非常大,很容易大到需要自己单独的头和体源文件 如果在单个文件中有一个小类,则可以将其包装在匿名名称空间中,并且行为良好的编译器不会在对象文件中包含与该类相关的符号。完全避免了名称空间污染的问题 但是,一旦该类被单独编译,这就无法工作——我们需要将其他内部实现代码链接到此对象文件,因此

在一个复杂的库或框架中,显然有时纯粹在内部需要类来实现更高级别的功能

通常,这些内部构件与内部构件的工作方式紧密耦合,因此向用户提供它们是没有意义的——他们所能做的就是试图篡改您的私有内部构件

同时,这些东西中的一些非常大,很容易大到需要自己单独的头和体源文件

如果在单个文件中有一个小类,则可以将其包装在匿名名称空间中,并且行为良好的编译器不会在对象文件中包含与该类相关的符号。完全避免了名称空间污染的问题

但是,一旦该类被单独编译,这就无法工作——我们需要将其他内部实现代码链接到此对象文件,因此它必须包含相关符号

由于头文件仅供内部使用,它可能与所有正文源文件位于同一文件夹中,而不是保存用户将包含的头文件的一些单独的
include
文件夹

但是,这些符号在对象库中仍然可见


这是一个真实的问题,还是一个虚构的问题?我应该做些什么(如果有的话)来管理这种形式的名称空间污染?

我通常将此类标识符放入
详细信息
名称空间:

namespace some_component {
  namespace details {
    class helper { ... };
  }
}

some_component::details::helper
显然是一个实现细节

+1-这样做时,名称冲突的可能性显然很小。我仍然有一种偏执的感觉,就是因为符号在那里,所以会发生一些坏的事情。“史提夫作为C++库的创建者,你的任务是记录并警告你从调用它的C++代码中滥用你的库。一天结束时,没有办法防止编译代码被误用,这似乎是你要问的。@Steve:当用户试图使用名为
…::details::helper
的东西时,这个东西炸到了他们的脸上,那就是那些用户的错。这不是我想的。我不知道我在想什么,只是“一些不好的事情”。我想有一种想法是,有人拆卸一个专有的图书馆会从这些符号中得到更多的线索,但我怀疑这对很多人来说是一个严重的问题。从零开始编写库可能比反向工程其他人更容易,而不是检查他们调用的外部API。您目前正在做的任何事情都会遇到问题吗?如果不是,那就什么都不要做——关于敏捷/XP开发的唯一原则,我或多或少完全同意的是雅格尼。@Neil——这是我拥有的这个新系统的一部分。当我对某事感到紧张,好像我做了错事,一旦我会浪费时间担心它或试图构建一些聪明但不切实际的解决方案。这些天来,我问了一个问题,对这个问题看起来有多愚蠢感到尴尬,也许会因为一些无关紧要的事情发生激烈的争吵。我不确定哪种方式会浪费更多的时间,但激烈的争吵部分会更有趣;-)