问题标签 [one-definition-rule]

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 投票
3 回答
1363 浏览

c - 是否允许不同的翻译单元定义具有相同名称的结构?

假设我有a.cb.c,它们都定义了名为struct foo的类型,但定义不同:

 

在 C 中,这些文件可以作为符合标准的程序的一部分链接在一起吗?

(在 C++ 中,我相信这是单一定义规则所禁止的。)

0 投票
3 回答
1267 浏览

c++ - 为什么是 C++模板类不会破坏一个定义规则?

也许这是蹩脚的问题,但我不明白!如果我包含<string>或包含<vector>多个翻译单元(不同的 .cpp),为什么它不会破坏 ODR?据我所知,每个 .cpp 的编译方式都不同,因此将为每个目标文件分别生成向量的方法代码,对吧?所以链接器应该检测到它并抱怨。即使它不会(我怀疑这是模板的特殊情况),当我将所有内容链接在一起时,它是否会在每个单元中使用一个代码或一组不同的克隆代码???

0 投票
2 回答
4901 浏览

c++ - 在头文件中使用 lambda 会违反 ODR 吗?

是否可以在头文件中写入以下内容:

或者

我猜在每个源文件中,lambda 的类型可能不同,因此std::function(target_type的结果中包含的类型会有所不同)。

这是否违反了 ODR(单一定义规则),尽管看起来像是一种常见的模式和合理的做法?第二个样本是否每次都违反 ODR 或仅当至少一个构造函数位于头文件中时?

0 投票
1 回答
1542 浏览

python - Scipy.Odr 多变量回归

我想用scipy.odr. 我阅读了 API 文档,它说多维是可能的,但我无法使其工作。我在互联网上找不到工作示例,API 真的很粗糙,没有提示如何继续。

这是我的 MWE:

它引发以下异常:

这似乎与我的矩阵形状有关,但我不知道如何正确塑造它。有人知道吗?

0 投票
2 回答
1157 浏览

c++ - 将静态 constexpr 类成员分配给运行时变量

我知道有很多类似的问题,但不知何故不同。这是关于以下情况:

据我了解constexpr是用于编译时常量。因此编译器已经可以进行一些计算,例如计算VALUE. 此外,我显然可以定义 a constexpr std::array<,>,从中我可以将值分配给运行时变量。我希望编译器已经设置value = 4到可执行程序中,以避免加载操作。但是,我不能直接从静态成员分配,得到错误

这对我来说毫无意义,因为它可以通过另一个constexpr变量的中间步骤来完成。

所以我的问题是:为什么不能将类的静态 constexpr 成员分配给运行时变量?

注意:在我的 MWE 中,该类是一个模板类,不会影响错误。但是,我最初对这种特殊情况感兴趣,我希望它对非模板类更通用。

(编译器是clang++g++-std=c++11- 他们给出相同的错误)

编辑:@Bryan Chen:忘记了输出行。现已添加。

0 投票
0 回答
153 浏览

c++ - 全局常量定义的变量模板语法

C++14定义x某种类型的全局常量的方法X是:

该技术使我们能够避免 ODR 违规(由于变量模板的外部链接)。

但是对于函数模板,在以下情况下可以方便地省略尖括号:

即使所有(非类型)模板参数都有默认(值),是否有任何理论上的理由否认引用没有模板参数列表的变量模板的可能性?能够以如下形式定义全局常量(例如,在仅标头库中)将非常方便:

然后能够在a没有任何尖括号的情况下引用。

0 投票
2 回答
708 浏览

c++ - 关于 ODR 使用的另一个 clang/gcc 差异?

为什么这段代码可以用 GCC(4.9 和 5+)编译,但不能用 clang(3.5-3.9)编译?

我有一些模糊的想法,即差异与 ODR(一个定义规则)的使用有关,但我不太了解,无法弄清楚这里发生了什么。

0 投票
1 回答
1139 浏览

android - 如何在通过 Android.mk 构建的存档上运行 ranlib?

这已经出现在我经常使用的几个库中。参见,例如:

在问题中,用户为 OpenSSL 和 Crypto++ 库创建了一个 Android.mk。痛点似乎是用户将 Android.mk 包装器添加到源中。

在 Android 之外,每个项目都是基于 Makefile 的,每个项目构建一个静态归档,每个项目基于静态归档构建一个共享对象。每个项目也在ranlib静态存档上运行。Crypto++ 对这一需求特别敏感,ranlib因为它的 C++ 库和违反一个定义规则会导致未定义的行为。

在使用 Android.mk 构建静态存档时,我们如何通过 Android.mk 在存档上运行 ranlib?

0 投票
1 回答
242 浏览

c++ - visual c++ multiple definitions of constants

I have one header and two source files.

main.cpp:

constant.h:

constant.cpp:

When I compile with Visual C++(Visual Studio 2015 Update 1) I get lots of multiple definition linker errors.

EDIT: it only happens when the /Za(Disable Language Extensions) switch is enabled

All of them seem to originate from the <limits> header.

Here are the first few errors(sorry for german compiler output):

However, when I compile the same code with Clang/C2 or with g++ or clang++ on linux, I don't get any linker errors.

Does this program violate the ODR and is Visual C++ correct in rejecting it?

0 投票
1 回答
1079 浏览

c++ - 不同翻译单元中类的多重定义

我对 C++ 标准第 3.2 节 [basic-def-odr] 项目符号点 6(即 -3.2.6)几乎没有疑问。

指定了几个条件来判断一个类是否可以多次定义,每个定义都在单独的翻译单元中。

我无法在此项目符号中找到以下强调部分的示例:

在 D 的每个定义中,对应的名称,根据 [basic.lookup] 查找,应指在 D 的定义中定义的实体,或在重载解析 ([over.match]) 后引用相同的实体,并且在匹配部分模板特化 ([temp.over]) 之后,除了如果对象在 D 的所有定义中具有相同的文字类型,并且该对象是使用常量表达式 ([expr.const]) 进行初始化,并且该对象未被使用,并且该对象在 D 的所有定义中具有相同的值。

任何人都可以举一个例子,其中“应引用在 D 的定义中定义的实体”结果是错误的,并且将多个定义视为错误......

如果可以提供示例来解释同一部分中的以下项目符号,那将更有帮助。

在 D 的每个定义中,(隐式或显式)函数调用使用的默认参数被视为其标记序列存在于 D 的定义中;也就是说,默认参数受上述三个要求的约束(并且,如果默认参数具有带有默认参数的子表达式,则此要求以递归方式适用

提前致谢