问题标签 [static-initialization]

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 回答
495 浏览

c++ - 当我通过静态函数访问静态成员时,是否会出现静态初始化命令惨败?

这个特定的代码是否容易出现静态初始化顺序惨败?也就是说,当我访问 B 的静态成员函数时,我可以假设编译单元“B”中的静态初始化已经完成吗?

或者我有这样的代码:

对标准的引用将不胜感激。

0 投票
6 回答
5481 浏览

c++ - 如何强制初始化静态成员?

考虑这个示例代码:

也在 Ideone 上。)

我希望dummy一旦有 的具体实例化就可以初始化Foo,我有Bar. 这个问题(以及最后的标准报价)解释得很清楚,为什么没有发生。

[...] 特别是,静态数据成员的初始化(以及任何相关的副作用)不会发生,除非静态数据成员本身的使用方式要求静态数据成员的定义存在。

有没有什么方法可以强制 dummy初始化(有效地调用register_而没有任何实例BarFoo(没有实例,所以没有构造函数诡计)并且用户Foo不需要以某种方式显式声明成员?不需要派生类做任何事情的额外 cookie。


编辑找到一种对派生类影响最小的方法:

不过,我仍然希望派生类不必这样做。:|

0 投票
2 回答
517 浏览

c++ - 静态成员显式定义

考虑这段代码:

这里 A 行明确定义了 Wilma 类的静态 int a。(注释掉会导致链接器错误),没有它,链接器会给出未定义的引用错误。(因为 Wilma::i 实际上正在被使用,如果我不使用它,则没有链接器错误在那儿。)

Fred 类的静态 Wilma wilma_ 也应如此,即它也应显式定义..因为它也在 B 行的代码中使用。但事实并非如此,如果 Fred::wilma_ 没有链接器错误没有明确定义。为什么?在 gcc 4.5.2 上测试

编辑: 我不知何故对此有另一个疑问......

LINE CLINE B都试图使用一个类的静态对象,int Wilma::i并且Wilma Fred::wilma_分别。但是只有一个定义int Wilma::i是强制性的?

为什么不是Wilma Fred::wilma_;强制性的?

我理解B 行是无操作的答案。但是C线也可以这样说??

0 投票
2 回答
1120 浏览

android - Android中的全局初始化

我正在编写一些作为 jar 文件分发的库代码,开发人员在使用之前需要使用应用程序 ID 对其进行初始化。初始化只是一个函数调用,比如

棘手的是我不确定如何指导开发人员进行这个初始化调用。起初,我认为主要活动中的单个静态初始化程序块将是最简单的方法。问题是用户可以通过其他一些活动或意图进入应用程序,并且不会加载主要活动。有没有一种通用的方法来确保在应用程序启动时运行一行代码,而不管应用程序是如何启动的?

初始化调用是幂等的,所以我可以告诉人们在每个可以使用它的地方进行初始化调用,但这会很麻烦。

0 投票
3 回答
2511 浏览

java - 按需初始化习语与单例实现中的简单静态初始化程序

在使用静态初始化实现线程安全的单例时,Initialize-On-Demand 习语真的有必要吗,还是一个简单的实例静态声明就足够了?

将实例简单声明为静态字段:

对比

我问这个是因为 Brian Goetz 在本文中推荐了第一种方法:

http://www.ibm.com/developerworks/java/library/j-dcl/index.html

而他在本文中建议后者

http://www.ibm.com/developerworks/library/j-jtp03304/

后一种方法是否提供了前一种方法没有的任何好处?

0 投票
2 回答
575 浏览

c++ - “第一次使用时构造”成语在任何情况下都会失败吗?

我正在使用一些静态库构建我的程序(实际上是测试)。
这个库包含一个文件,其中我有这样的功能:

然后在我的 main.cpp (图书馆外)我正在做:

我得到这个输出:

所以看起来像对函数的第二次调用(但从库内的不同文件完成)以某种方式清除以前的值,重新初始化它,或者使用它自己的副本。
我将 GetString 函数更改为使用“新”,但结果完全相同(顺便说一句,程序永远不会崩溃)。
但我不明白热这可能吗?
任何想法我做错了什么?

- - - - - - - - - - - - - - - - 更新 - - - - - - - - - ------------

  1. 测试完成是单线程环境。
  2. 它适用于某些平台,有些则不适用(适用于 windows、MacOS 和 AIX,不适用于 linux、HP_UX、Solaris、FreeBSD...)
  3. 我在执行期间验证了 strFilename 的地址(GetString 中的 printf),看起来它是一个没有重复的变量(地址始终相同)
  4. 但是,在最终的库中使用 nm 我会得到类似的结果:

0000000000000030 T _Z16GetLogprintfFilev
0000000000000008 b _ZGVZ16GetLogprintfFilevE16strLogprintfFile
0000000000000018 b _ZZ16GetLogprintfFilevE16strLogprintfFile
U _Z16GetLogprintfFilev

在我的基础库上使用 nm (由最终库使用)我得到:

0000000000000030 T _Z16GetLogprintfFilev
0000000000000008 b _ZGVZ16GetLogprintfFilevE16strLogprintfFile
0000000000000018 b _ZZ16GetLogprintfFilevE16strLogprintfFile

0 投票
1 回答
2143 浏览

java - “after() : staticinitialization(*)”的@AspectJ 语法

我正在尝试使用pertypewithin实例化模型来实现跟踪方面。通过这种方式,我将能够为每种类型的每个类使用一个记录器。

从周围的一些示例中,我们可以找到以下代码来初始化记录器:

不幸的是,我无法将其完全转换为@AspectJ 语法(这是我无法控制的项目要求),尤其是我需要设置记录器的部分,只执行该代码一次。

这可能吗?

谢谢,

0 投票
3 回答
274 浏览

android - 从 Android 库调用非库代码

自从 Android 引入库项目以来,我一直在将我的应用程序转换为库,以便我可以制作几个经过适当调整的版本(例如,使用相同代码库的免费版和专业版,但改变了一些东西)。

我最初在允许库项目的代码访问我的子项目中的字段时遇到了麻烦。换句话说,我的免费版和专业版都有一个类,其中包含一些常量,库项目将使用它们来区分某些特性。

在子项目中,我扩展了库的主要活动并添加了一个静态初始化块,它使用反射来更改库中字段的值。

在这段代码中,ConstantsHelper 在库中,我从我的子项目中提供了 Constants.class。这将初始化库项目中的常量。

我的方法效果很好,除了一个特定的用例。当应用程序有一段时间没有使用并且被操作系统“停止”时,ConstantsHelper 中的静态字段会被遗忘。

常量应该由主要活动重置(如上所示),但主要活动甚至没有启动,因为操作系统恢复了不同的活动。这样做的结果是常量的初始化被忘记了,我无法重新初始化它们,因为恢复的活动在库中(它不知道子项目)。

如何“告诉”库中的其他活动在恢复时从子项目中调用代码?或者,有没有办法确保我的子项目中的某些代码在每份简历上都被调用?

0 投票
2 回答
3597 浏览

c++ - C++ 是否可以延迟常量静态成员的初始化?

我正在使用 Qt,但这是一个通用的 C++ 问题。我的情况很简单,我有一个类Constants,它有一个常量静态成员,我希望在进行某些函数调用后对其进行初始化。

常量.h

常量.cpp

主文件

编译时我得到:

QCoreApplication::applicationFilePath: 请先实例化QApplication对象

所以这里的问题很明显。在 Constants.cpp 中调用 QApplication 的静态函数时,Qt 尚未安装 QApplication。我需要以某种方式等到QApplication a(argc, argv);在 main.cpp 中传递行

有可能吗?如果没有,你还能建议什么来克服这个问题?

谢谢

0 投票
3 回答
342 浏览

c# - C# 中的集合初始化器

在 Java 中,我可以创建一个 List 并使用静态初始化程序立即填充它。像这样的东西:

这很方便,因为我可以动态创建列表,并将其作为参数传递给函数。像这样的东西:

我是 C# 的新手,并试图弄清楚如何做到这一点,但我空空如也。这在 C# 中可能吗?如果是这样,怎么办?