问题标签 [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++ - 如何从 PDB 文件中获取未命名命名空间中变量的文件信息?
我需要从 PDB 文件中获取与未命名命名空间中的变量相对应的文件名。我正在使用 VS2012 和 C++。我整理了一小部分琐碎的代码来说明问题:
我需要一些方法来查看 PDB 文件并获得足够的信息来区分单独的 compilands 中的 x 和 xx 的两个实例。
我下载并玩了一个名为 dia2dump 的项目(来自https://msdn.microsoft.com/en-us/library/b5ke49f5.aspx),这确实有助于了解 DIA 系统的工作原理,相比之下IDiaSymbol 上的 MSDN“文档”大多缺乏任何上下文,并且几乎没有有意义的代码示例。
似乎没有将符号 x 和 xx 与源文件名联系起来的好方法。
我可以得到一个 IDiaSymbol* pSymbol,但是看起来它们可能实际上提供了我需要的各种函数都返回 S_FALSE:“S_FALSE 的返回值意味着该属性不适用于该符号。”
这是我在 dia2dump 中插入的一些代码片段:
我无法找到任何线索说明为什么 get_sourceFileName() 没有返回任何有用的信息。
我猜我要么 1) 找错了地方,要么 2) 编写调试接口访问 DLL 的程序员认为在匿名命名空间中为符号实现该功能不够重要。我希望它是#1,以便有人可以指出我设法忽略的任何内容。
只要你提供有用的信息,甚至可以取笑我的无知......
c++ - 如何在匿名命名空间中调用可变参数模板助手?
在下面的代码中,foo
应该是任何人都可以访问的函数,但foo_helper
不应该,这就是我将它放在匿名命名空间中的原因。显然我在这个例子中省略了包括警卫和包括,但他们在那里。
foo.h
:
foo.cpp
:
问题是,为了让foo_helper
的可变参数模板工作,它需要有没有参数的初始版本。但是,这迫使我定义一个非模板函数是一个头文件,在将这个文件包含在多个源文件中后会中断。我无法将 的定义移动foo_helper
到源文件,因为它位于匿名命名空间中,因为它不应该是可访问的。
有没有办法解决这个问题?
c++ - 在确保翻译单元之间的可用性时是否不推荐使用静态?
从以下stackoverflow 答案中,用户说:
这意味着该变量对于翻译单元是本地的(简单地说,对于单个源文件),并且不能从其外部访问。这种使用 static 实际上在当前的 C++ 标准中已被弃用 - 相反,您应该使用匿名命名空间:
应该:
我不同意匿名命名空间是首选方法,
但现在真的不推荐使用静态了吗?
标准在哪里说这个?
c++ - 未命名命名空间内名称的外部链接
根据 C++ 标准第 3.5/4 条:
未命名的命名空间或在未命名的命名空间中直接或间接声明的命名空间具有内部链接。
同时在第 7.3.1.1 段中,我们有注释 96):
尽管未命名命名空间中的实体可能具有外部链接,但它们有效地由其翻译单元唯一的名称限定,因此永远无法从任何其他翻译单元看到。
如果标准保证无法从另一个翻译单元访问未命名命名空间内定义的名称,如何显式地为未命名命名空间内的名称建立外部链接以及如何检查链接实际上是外部的?
在哪些情况下为未命名命名空间中的名称进行显式外部链接是有用的?
c++ - 名称冲突、未命名的命名空间、类模板
我有一个类模板Foo<T>
,源自FooBase
.
富.h:
然后,我有两个翻译单元用不同T
的 Foo 实例化。用作模板参数的类T
在两个翻译单元中都被调用,但受一个未命名的命名空间保护。每个翻译单元定义一个自由函数。
测试1.h:
测试1.cpp:
测试2.h:
测试2.cpp:
最后,我有一个调用两个自由函数的主函数,并且我链接了所有三个翻译单元。
主.cpp:
问题:这是合法的 C++11 吗?
我认为应该是因为名称冲突是由未命名的命名空间解决的。但是,我现在很怀疑,因为:
- GDB(v7.7.1,在 Kubuntu 14.04 64bits 上)对此真的很困惑
- 我的真实案例中有一些奇怪的错误,我无法追踪
广发银行
GDB 在 test2() 上发出这些警告:
并且无法确定它base
实际上是动态类型Foo
,因此无法检查其成员t
。此外,而不是好的
我在 test1 上得到,我在 test2 上得到以下信息:
更糟糕的是,在检查foo.t
test1 时,它发现foo.t.x
应该只存在于 test2 中的成员!
请参阅下面的 QtCreator 中的屏幕截图:
T1
如果我在 Test1.cpp 和Test2.cpp 中命名模板参数,所有上述问题都得到解决T2
。
尽管 GDB 很混乱,但在我围绕这个最小示例尝试的所有变体中,程序似乎总是表现正确(GCC 4.8.2)。例如,通过从 base 调用的虚拟方法打印 sizeof(T) 分别正确返回test11
和4
test2 (在打印时1
,1
如果我删除未命名的命名空间,由于实际的名称冲突,我知道这会使代码不合法 C++ )。
真实案例
在我的真实案例中,我有一个段错误:
- 总是以“全局范围内的同名”出现(显然)
- “未命名命名空间下的同名”意外发生
- 从未发生过手动分配的唯一名称
我不知道这是否是因为手动分配唯一名称可以解决问题(可以吗,因为它们已经在未命名的命名空间中??),或者我的代码仍然在其他地方损坏并且我只是“幸运”(即,隐藏的未定义行为,非常可怕)。我花了两天时间试图减少一个仍然以这种方式崩溃但失败的最小示例。我只设法获得了最少的有效示例,或者我的实际代码有时会崩溃。
c++ - 不必要地使用未命名的命名空间 C++
我在公司到处都能看到这样的代码:
我很困惑为什么你需要一个匿名的命名空间。一方面,您需要MAX_LIMIT
AND的本地翻译单元TOKEN
。但是由于const
. static const
和简单const
都实现本地翻译单元。
另一方面,如果文件中某处有一个名称相同的变量,则不会发生命名冲突。
这将证明匿名命名空间是合理的。但是,您多久需要在函数中使用一个实际上已经被const
函数外部声明的变量占用的变量名?我的答案是永远不会。所以在实践中,对我来说,不需要未命名的命名空间。有什么提示吗?
c++ - 访问匿名命名空间内的变量(C++)
我有以下代码,但我不知道如何在此设置中访问匿名命名空间内的 x。请告诉我怎么做?
c++ - 函数与来自未命名命名空间的参数的链接
显然,该函数的符号将引用 A 的名称,它是唯一命名的命名空间的成员(由于this)。
foo 的联系是什么?
c++ - 未命名命名空间中未命名类的实例
使用带参数的函子通常如下所示:
对于没有参数的仿函数,代码可能变成
但我更喜欢以下用法:
它具有以下优点:
- 更简洁
- 直接调用仿函数时更具可读性:
some_functor_without_params(i)
而不是some_functor_without_params()(i)
- 可与功能互换:
bool some_functor_with_params(int i) {return i == 42;}
我在头文件中通过以下方式实现了它:
我认为结构不需要名称,因为它没有用户声明的构造函数(也没有析构函数,也没有任何需要结构名称的东西)。我将对象放在一个未命名的命名空间中,这样每个编译单元都有自己的some_functor_without_params
,并且没有“双重定义”链接错误。
是否有任何性能损失或我看不到的任何其他缺点?
这种方法按预期工作,直到我在 Visual C++ 2013 中遇到一个非常奇怪的编译错误,在命名仿函数类型时消失了,即替换
和
错误只出现在 Debug 中,不在 Release 中,并且状态
在文件中xstring
,这里:
它看起来像一个编译器错误,你怎么看?
c++ - 如何访问嵌套在命名命名空间内的未命名命名空间变量?
这个问题已经在命名命名空间内的未命名命名空间链接中讨论过, 但没有提供关于如何访问嵌套在命名命名空间下的未命名命名空间变量的完美答案,以防两个变量相同
考虑本准则
未命名的命名空间"variable a"
总是隐藏的。如何访问"variable a"
未命名的命名空间?
在命名空间中声明未命名的命名空间是否合法?