问题标签 [unnamed-namespace]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 嵌套未命名的命名空间?
使用未命名的命名空间时,如果它嵌套在另一个命名空间中,会有什么问题吗?例如,以下代码中的 Foo1.cpp 和 Foo2.cpp 之间是否有任何真正的区别:
c++ - 是否应该避免使用未命名的命名空间函数来减少符号表的大小?
我听说它断言在 C++ 中使用未命名的命名空间来定义函数并确保不能从定义它们的编译单元外部调用它们在非常大的代码环境中不好,因为它们会导致符号表增长通过在 C++ 编译器在未命名时提供的自动生成的命名空间中包含这些符号的条目而不必要地大。
这可能是因为上述内容应该与执行以下操作相同:
然而,真的那么简单吗,编译器是否需要为生成的命名空间名称中的符号创建符号表条目?
相反,在这种情况下,我听说它建议使用静态声明:
在函数之前使用静态声明而不是将其放置在未命名的命名空间中是否具有使函数在定义它的编译单元之外无法访问的相同效果?除了可能不会导致符号表增长之外,这两种方法之间是否有任何区别?
由于未命名的名称空间导致的符号表膨胀问题只是 C++ 的某些实现中的一个错误,还是标准要求编译器以某种方式为此类函数创建条目?如果这种膨胀被认为是一个错误,那么是否有已知的编译器不存在这问题?
c++ - 未命名的命名空间与全局声明
使用未命名的命名空间和全局声明有什么区别?
使用这两个有什么特定的上下文吗?
我们可以访问外部源文件中未命名的命名空间组件吗?
c++ - 大声限制对命名空间中定义的全局变量的访问
考虑到头文件中的以下内容,我有一个与命名空间有关的小问题:
我不希望用户能够更改_member
via的值A::B::_member = some_value
。在阅读了未命名的命名空间后,我将其更改为:
这会强制用户使用提供的 mutator 函数并且效果很好,除了一个问题:
如果用户继续使用:A::B::_member = some_value
代码没有编译、链接、运行失败;该语句被忽略,使用默认值0.01
可能导致运行时错误或“OMG WTF IS WRONG BBQ!!1!!” 时刻。(虽然我不确定,但声明没有失败可能是 MSVC++ 和 VS2010 的问题。)
问题:有没有办法让代码在A::B::_member = some_value
错误使用时以某种方式大声失败?
c++ - 在标头中使用未命名的命名空间会如何导致 ODR 违规?
在 Google C++ Style Guide 中,命名空间部分指出“在头文件中使用未命名的命名空间很容易导致违反 C++ 单一定义规则 (ODR)。 ”
我明白为什么不在实现文件中使用未命名的命名空间会导致 ODR 违规,但不知道在标头中使用如何做到这一点。这怎么会导致违规?
c++ - 两个未命名的命名空间,在同一个声明区域中定义
考虑以下代码:
此代码无效。这是因为a
发生了重新定义。但我预计这是有效的。实际上,秒。3.3.6/1 说:
[...]由原始命名空间名称表示的潜在范围是由同一声明区域中的每个命名空间定义与该 原始命名空间名称建立的声明区域的串联。[...]
但是未命名的命名空间定义不是 original-namespace-definition 和 sec。7.3.1/1 说:
和
此外,秒。7.3.1.1 说:
未命名的命名空间定义的行为就像它被替换为
其中 inline 出现当且仅当它出现在 unnamed-namespace-definition 中时,翻译单元中所有出现的 unique 都被相同的标识符替换,并且该标识符不同于整个程序中的所有其他标识符。
这意味着两个未命名的命名空间具有不同的唯一性。
你能解释我引用的代码中的行为吗?
c++ - 我可以在函数中使用未命名的命名空间而不是静态变量吗?
我已经浏览了有关未命名命名空间的所有相关问题,但我看不出它们是否以及如何用于static
在这种情况下替换变量:
c++ - C++ 类设计:未命名命名空间或私有类方法中的类或函数?
我正在扩展现有的一类新功能,但我对使用哪种设计解决方案表示怀疑。有几个,每个都有优点和缺点。我的情况是这样的:我有一个特殊格式的文件头,我要读取并保存它。有一个名为 FileHeader 的类,它已经实现了一些从/到流的序列化和一些其他功能。我的任务列表中的一项是添加特定的时间戳功能。自 1994 年 1 月 1 日 00:00:00 以来,时间戳应以秒为单位读取/存储。但是 FileHeader 类将日期和时间存储在两个单独的变量中。因此,我需要编写从/到秒到日期和时间的转换。问题是这个功能应该驻留在哪里。我使用 secondsPerDay (60*60*24) 和 dateOrigin (1/1/1994) 作为常量。
我看到有以下选项:
A) 将转换实现为 FileHeader 类的私有方法。然后 secondsPerDay 和 dateOrigin 将是该类的静态私有常量。
这更直接。但我不喜欢的是它给已经很重的课增加了更多的责任。你知道规则:一类=一项责任。例如,维护会很困难。如果有人决定将秒数更改为分钟或其他值,他会重写方法,但如果不够小心,可能会留下静态常量 secondsPerDay,尽管不再需要它。等等。此外,我不喜欢我必须更新头文件这一事实,尽管它只影响实现细节。
B) 仅在 .cpp 文件中的未命名命名空间中执行实现,并使用普通函数和静态变量:
FileHeader 的保存和恢复方法会调用这些函数。嗯,我更喜欢它。我没有弄乱标题,类的 FileHeader 责任没有增长。但是,如果有人决定将算法更改为使用分钟而不是秒,他可以更改函数,但如果不小心,他会留下不必要的 secondsPerDay 静态变量,即使不再需要它。
C) 在 FileHeader.cpp 中使用未命名的命名空间和其中的专用类。
FileHeader 保存和恢复将调用这些静态方法,例如
我个人选择了这个解决方案。它不会弄乱标题,它在视觉上限制了静态变量的范围,因此如果有人将 TimeConverter 的实现从秒更改为分钟,他很可能不会留下不必要的静态变量 secondsPerDay... 目前TimeConverter 不被任何其他类(仅 FileHeader)使用,但如果更改,它可以很容易地移动到它自己的头文件和源文件中。
在编写代码时,我意识到这是我扩展现有类的新实现细节的功能的常用方式。因为我经常这样做,所以我很好奇其他人正在使用什么以及为什么。根据我的经验,95% 的开发人员使用选项 A 并扩展类。所以这里有问题:
还有其他好的和有用的选择吗?
我错过了使用这些选项的一些重要方面或含义吗?
更新:根据以下答案之一的建议,我特此提出选项 D:
以及接下来的一个问题 - D 如何比 C 更好,反之亦然。优缺点都有什么?
c++ - 为什么要将类型放在未命名的命名空间中?
我了解使用未命名的命名空间使函数和变量具有内部链接。头文件中不使用未命名的命名空间;只有源文件。源文件中声明的类型不能在外部使用。那么将类型放入未命名的命名空间有什么用呢?
请参阅这些链接,其中提到类型可以放在未命名的命名空间中: