问题标签 [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.

0 投票
0 回答
45 浏览

c++ - 如何在外部定义多个未命名命名空间的成员?

在使用namespaces时,避免名称冲突确实是一件好事。但重要的是我:使用anonymous namespaces.

在我的示例中,出于某种原因,我定义了两个未命名的命名空间,并且意外地这两个具有相同签名的成员函数。我想在命名空间之外定义这两个。

  • 有多个未命名的命名空间时如何避免名称冲突?

谢谢你。

0 投票
1 回答
253 浏览

c++ - 为什么我会收到警告说函数已使用但未定义和已定义但未使用?

我遇到了一对不寻常的编译器警告,它们似乎相互矛盾。这是我写的代码:

换句话说,我在未命名的命名空间中定义了一个 lambda 函数,该函数前向声明了稍后在该未命名命名空间中定义的函数。

当我使用 g++ 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1) 编译此代码时,我收到以下两个警告:

这很奇怪,因为第一个警告说我正在使用一个没有定义它的函数,而第二个警告说我正在定义一个没有使用它的函数。

运行这个程序确实会产生输出

程序正常终止。

有趣的是,如果我不使用未命名的命名空间,而是为命名空间命名,这些警告就会消失,如下所示:

代码的修改版本,与原始代码一样,打印出一条消息,指示theRealCallback已调用。

有人可以解释为什么我会收到这些警告吗?我的猜测是,这与 lambda 函数中函数的前向声明有关,因为它被解释为出现在未命名命名空间中的后一个函数之外的东西,但如果是这种情况,我不确定我看到为什么这个链接最终以及为什么我收到这些警告。

0 投票
1 回答
183 浏览

c++ - 非内联命名空间不能作为内联重新打开

我在理解编译器的投诉时遇到问题:

gcc 说

必须在初始定义时指定内联命名空间

MSVC 说明了标题中的内容。

我的混乱来自我的期望,即两个后续的匿名命名空间应该被视为一个不相关的新空间的新声明,但编译器抱怨它们以某种方式链接,就像它试图用第二个扩展第一个命名空间一样。

https://godbolt.org/z/rwAYLg

0 投票
0 回答
67 浏览

c++ - 不同未命名空间中的重定义错误

我在两个不同的未命名命名空间中的两个函数有一个重新定义问题,每个函数都放在两个单独的文件中。

第一个函数分组在一个文件中:

. . .

然后部分功能分组在另一个文件中:

. . .

但是在我的应用程序文件中,程序说我对函数 isValid() 有重新定义问题。你们能告诉我如何解决这个问题吗?

0 投票
0 回答
13 浏览

static - 在未命名的命名空间中默认初始化的内置类型的对象是否具有明确定义的默认值?

AFAIK 我们应该为全局对象使用一个未命名的命名空间,我们希望使它们成为翻译单元的本地对象,而不是将这些对象定义为static全局对象。所以那里的对象是隐含的静态的。

我想知道在没有初始化程序(默认初始化)的情况下定义内置类型的对象是否int具有与显式定义相同的定义值static

这是一个例子:

0 投票
1 回答
133 浏览

c++ - C++ 模块是否使未命名的命名空间变得多余?

C++20 引入了模块。任何未在模块中导出的符号都具有模块内部链接。虽然未命名的命名空间提供了一种机制,使未命名命名空间内的定义具有文件内部链接。这是否意味着将来当模块在 C++ 社区中变得普遍时,未命名的命名空间将变得无用?

0 投票
1 回答
118 浏览

c++ - 当标头和实现分开时,静态或未命名的命名空间仍然有用吗?

正如在这个问题中回答的那样,我了解到static函数的关键字意味着它只能从该文件中的函数中看到。我认为未命名的命名空间可以用于相同的目的。

但是,通常,实现和头文件是分开的。因此,在我看来,程序员可以通过不在头文件中编写此类私有内容的声明来隐藏实现文件中的所有“私有内容”。

考虑到上述情况,未命名的static命名空间何时有用?我能想到的唯一情况是多个实现文件对应一个头文件。

0 投票
0 回答
61 浏览

c++ - 有没有办法在标头中定义函数模板并使包含标头的文件无法访问?

我有一个看起来像这样的类模板:

foo.h

文件.tpp

忽略该.tpp文件,我这样做只是为了给人一种分离声明和实现的错觉,显然这(有点)用模板是不可能的。

我的实现文件实际上要长得多,在其中我有一些成员函数使用的全局范围帮助函数模板,作为成员函数没有意义的函数,并且我不希望类的用户拥有任何东西与。

我一直在.cpp-implementation 文件中这样做,但我忘记了当我在这个伪造的.cpp文件版本中这样做时,这些小帮助函数的声明和实现实际上最终在类模板头文件中。这会导致类模板头的用户在他们的命名空间中混杂着在成员函数实现之外无用的辅助函数。

显然我可以把它们放在一个命名空间中:

但它仍然导致外部代码能够使用这些功能。它们只对成员函数的实现很重要,我希望能够反映这一点。

在寻找解决方案时,我了解了未命名命名空间的概念。据我了解,它们只允许当前翻译单元访问其内容。这听起来正是我需要的,所以我将辅助函数更改为:

但它不起作用,这些函数仍然可以从包含标题的文件中使用。

有没有办法从外部代码中隐藏这些辅助函数?