问题标签 [inline-namespaces]

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 投票
1 回答
1598 浏览

c++ - MSVC (10.0/11.0) 的内联命名空间模拟

有没有办法inline namespace用 MSVC 模拟?

LLVM 的 libc++ 使用它来创建一个隐藏的版本化命名空间,如下所示:

并在 GCC 上模拟它,如下所示:

现在我的问题是,如何使用 MSVC 实现相同的目标?如果这是不可能的,我会很高兴有一个解决方案,它忽略了版本控制(现在),我猜应​​该是

但有点违背了目的......

0 投票
3 回答
11620 浏览

c++ - 如何获得与 C++0x 标准兼容的 Coverity 静态分析?

我正在使用 Wind River Compiler 4(gcc (C) 和 g++ (C++)),它可以毫无问题地编译我的所有项目。现在我必须使用 Coverity 静态分析来检查我的代码。我已经配置了特定的编译器。对于 C 代码 (gcc) 没有问题,我可以运行分析,但对于 C++ 代码 (g++),我遇到了很多错误:

它似乎是一些 C++11 特定功能,例如内联命名空间,但代码不使用这些功能。上面的错误是由 HelloWorld-Code 产生的:

我尝试使用 g++ 选项设置 c++ 标准

但结果没有改变。

测试代码在一个大的构建层次结构中,但 Coverity 的步骤如下:

  1. 目标和环境设置(Wind River 4 Linux)
  2. 打扫干净
  3. 带有编译器目录和类型的 cov-configure
  4. cov-build 使用正确的“make all”命令单独工作
  5. 共分析
  6. if (no_error) cov-commit-defects

我还配置了 Coverity 以在 cov-build ( --ppp-translator replace/inline namespace/namespace) 期间将所有“内联命名空间”替换为“命名空间”。内联错误消失了,但它会产生更多这种重载错误并且没有成功构建。还尝试以相同的方式删除“C++”,但没有奏效,总是有更多错误。

有人知道这里有什么问题吗?我怎样才能在没有错误的情况下获得 Coverity 构建?也许我可以将 Coverity 配置为忽略 C++ 标准头文件,但我现在不怎么做?

0 投票
6 回答
63527 浏览

c++ - 什么是内联命名空间?

C++11 允许inline namespaces,其所有成员也自动包含在namespace. 我想不出任何有用的应用——有人可以给出一个简短的例子来说明inline namespace需要 an 并且它是最惯用的解决方案的情况吗?

(另外,我不清楚当 a在一个而不是所有声明namespace中声明时会发生什么inline,这些声明可能存在于不同的文件中。这不是在自找麻烦吗?)

0 投票
2 回答
2752 浏览

c++ - 为什么内联未命名的命名空间?

给专家的一个快速提示:C++11 允许声明未命名的命名空间inline。这对我来说似乎是多余的;在未命名的命名空间中声明的东西已经被使用,就好像它们是在封闭的命名空间中声明的一样。

所以我的问题是:这是什么意思

以及它与传统的有何不同

我们从 C++98 了解和喜爱的东西?任何人都可以举例说明inline使用时的不同行为吗?

编辑:只是为了澄清,因为这个问题已被标记为重复:我一般不会询问命名的内联命名空间。我了解那里的用例,我认为它们很棒。我特意询问将未命名的命名空间声明为inline. 由于未命名的命名空间必须始终是 TU 本地的,因此符号版本化理性似乎并不适用,所以我很好奇添加的inline实际作用


顺便说一句,关于未命名命名空间的标准 [7.3.1.1] 说:

inline当且仅当它出现在unnamed-namespace-definition中时才出现

但这在我的非语言律师眼中似乎是同义反复——“如果它出现在定义中,它就出现在定义中”!对于加分,任何人都可以解释这个标准的实际意思吗?

编辑: Cubbi 在评论中声称加分:

标准是说未命名命名空间定义的行为就好像它被替换为出现在X中的X如果它出现在未命名命名空间定义中inline

0 投票
1 回答
662 浏览

c++ - Does boost use C++11 "inline namespaces" to avoid ABI incompatibilty errors at runtime?

C++11 has a feature called "inline namespaces", which allows authors to enforce ABI compatibility at link time without tampering with the API. For instance, these helpful answers from @HowardHinnant explain how libc++ uses inline namespaces:

My question is: Does boost make use of this C++11 feature? It looks like some boost devs were at least thinking of eventually using it at one point. But that thread is pretty old. Did it ever happen? If so, does apply to all boost libraries, or only a subset?

0 投票
2 回答
1453 浏览

c++ - 内联命名空间中对命名空间的不明确引用

假设以下代码:

正如我们所见,这段代码是用 Clang 编译的;不是GCC,但是 - GCC 抱怨引用namespace detail是模棱两可的:

哪个编译器在这里做正确的事情?

0 投票
1 回答
253 浏览

c++ - 这个命名空间的目的是什么?

在 Boost 1.55 中,current_function.hpp内容如下:

为什么作者还要费心写那些命名空间?

0 投票
3 回答
999 浏览

c++ - 当存在内联命名空间时,如何显式引用封闭的命名空间?

请考虑以下代码:

Clang 和 G++ 都正确地标记Foo::ool为模棱两可。我可以Foo::Bar::ool毫无问题地调用,但有没有办法在不更改其声明的情况下调用版本 A?

我发现处于类似位置的人试图了解发生了什么,但我没有看到这种情况的解决方案。

我处于这种情况是因为我有一个项目,其中包含 and 的声明std::__1::pairstd::pair在不同的地方创建,并且std::__1是一个内联命名空间。std::pair我需要代码明确指向。有解决方案吗?

0 投票
2 回答
312 浏览

c++ - 用于在 C++ 中管理平台特定代码的内联命名空间技术

我已经看到使用 #ifdef 宏(例如 Eigen 库)来管理特定于平台的内容,但还没有看到任何人使用“内联命名空间”来管理特定于平台的代码。

下面的 github repo 给出了具体的代码和示例用法。 https://github.com/dchichkov/curious-namespace-trick/wiki/Curious-Namespace-Trick

我想知道这是否是一种可行的技术,或者是否有任何我看不到的陷阱。下面是代码片段:

输出 :

$g++ func.cpp -Dplatform=common ; ./a.out 常用添加

$ g++ func.cpp -Dplatform=arm ; ./a.out 手臂添加

0 投票
1 回答
2884 浏览

c++ - std::literals::.. 作为内联命名空间有什么好处?

在 C++ 标准(例如 N4594)中有两个定义operator""s

一个用于std::chrono::seconds

一个用于std::string

std::literals我想知道从这些命名空间(以及inline.

我认为它们位于不同的名称空间内,因此它们不会相互冲突。但是,当他们这样做时inline,这种动机就消失了,对吗?编辑:因为Bjarne 解释说主要动机是“库版本控制”,但这不适合这里。

我可以看到“秒”和“字符串”的重载是不同的,因此不会冲突。但是如果重载相同,它们会发生冲突吗?还是采取(inline?)namespace以某种方式阻止这种情况?

因此,从他们那里得到什么inline namespace?正如@Columbo 在下面指出的那样,跨内联命名空间的重载是如何解决的,它们是否会发生冲突?