当前位置: 首页 > 知识库问答 >
问题:

用全局常量初始化静态数据成员会导致未定义的行为吗?

沈凡
2023-03-14
const int internal_linkage_constant = 1;

class ExternalLinkageClass
{
  static const int constexpr_value = internal_linkage_constant; // #1
  int arr[internal_linkage_constant];                           // #2
};

共有1个答案

公羊子真
2023-03-14

没有例外。C++98标准在3.2章中规定:

在一个程序中,一个类类型(…)可以有多个定义,条件是每个定义出现在不同的翻译单元中,并且这些定义满足以下要求:

  • D的每个定义应由相同序列的令牌组成;和
  • 在D的每个定义中,相应的名称,根据3.4查,在重载解析(13.3)和部分模板专门化匹配(14.8.3)后,应引用在D的定义内定义的一个实体,或应引用同一实体,但如果对象在D的所有定义中具有相同的整型或枚举类型,并且用常数表达式(5.19)初始化对象,并且使用该对象的值(而不是地址),且该对象在D的所有定义中具有相同的值,则名称可引用具有内部或无链接的常量对象;
  • (…)
 类似资料:
  • 使用符合03标准的编译器(gcc-3.3.2的安全关键变体)。该标准规定必须定义静态成员对象(9.4.2(4))。它还规定“一个定义”规则适用,但不需要诊断(9.4.2(5))。以下代码有效吗? 也就是说,没有“静态常量int fred::JOE;”。我这样问是因为我们有一个例子(显然),模板类中的静态常量从未定义过,代码在某些上下文中工作,但在其他上下文中不工作。我用一个枚举替换了静态常量int

  • 本文向大家介绍C ++静态成员变量及其初始化,包括了C ++静态成员变量及其初始化的使用技巧和注意事项,需要的朋友参考一下 静态C ++成员变量是使用static关键字定义的。类中的静态成员变量由所有类对象共享,因为在内存中只有它们的一个副本,而与该类的对象数量无关。 如果没有以任何其他方式初始化静态类成员变量,则在创建类的第一个对象时将其初始化为零。 给出了一个演示静态成员变量及其在C ++中的

  • 考虑以下代码: GCC v6.1编译它,叮当声3.8拒绝它,错误如下: 2:错误:没有成员名为'foo'在'U' struct S{静态constexpr int bar=T::foo;}; 哪个编译器是对的? 会不会是因为在我们尝试在中使用它时不是一个完整的类型? 在这种情况下,它应该被认为是GCC的错误,但我想知道我是否正确之前在错误跟踪器上搜索/打开问题… 编辑 与此同时,我已经向GCC打开

  • C++标准1998的一些相关摘录: 根据标准,静态初始化发生在动态初始化之前,动态初始化可能发生在输入之后。我的问题是:在输入之前,全局变量是否初始化为?然后,如果所有线程都是在输入之后创建的,则全局变量的静态初始化保证是线程安全的。

  • 问题内容: 我想知道为什么默认情况下C,C ++和Java中的确切静态变量初始化为零?为什么对局部变量不是这样? 问题答案: 为什么要对静态变量进行确定性初始化而对局部变量不进行初始化? 了解如何实现静态变量。 它们的内存在链接时分配,并且它们的初始值也在链接时提供。 没有运行时开销。 另一方面,用于局部变量的内存是在运行时分配的。堆栈必须增长。你不知道以前在那里。如果需要,可以清除该内存(将其清