相关疑难解决方法(0)

什么是与Java静态块等效的C++习惯用法?

我有一个带有一些静态成员的类,我想运行一些代码来初始化它们(假设这段代码不能转换成简单的表达式).在Java中,我会这样做

class MyClass {
    static int myDatum;

    static {
        /* do some computation which sets myDatum */
    }
}
Run Code Online (Sandbox Code Playgroud)

除非我弄错了,C++不允许这样的静态代码块,对吧?我应该做什么呢?

我想要解决以下两个选项:

  1. 进程加载时(或加载此类的DLL时)会发生初始化.
  2. 初始化在首次实例化类时发生.

对于第二种选择,我在考虑:

class StaticInitialized {
    static bool staticsInitialized = false;

    virtual void initializeStatics();

    StaticInitialized() {
        if (!staticsInitialized) {
            initializeStatics();
            staticsInitialized = true;
        }
    }
};

class MyClass : private StaticInitialized {
    static int myDatum;

    void initializeStatics() {
        /* computation which sets myDatum */
    }
};
Run Code Online (Sandbox Code Playgroud)

但这是不可能的,因为C++(目前?)不允许初始化非const静态成员.但是,至少可以通过表达式将静态块的问题减少到静态初始化的问题......

c++ java initialization static-block equivalent

28
推荐指数
3
解决办法
1万
查看次数

链接时,“获取所需的内容”和“全部获取”之间是否存在某些内容(-Wl,-整体存档)?

我有这个库,其中包含一些需要在之前运行的静态初始化代码main()。如果您只将所有翻译单元一起编译,那么一切都很好,但是如果我提供一个静态库(.a文件)并让用户将其应用程序链接到它,则它不起作用-链接器只是忽略了进行我的静态初始化的符号。

或者,如果我为GCC指定选项,即为GNU链接指定选项,则可以使链接程序在静态库中接收所有内容-Wl,--whole-archive--whole-archive

但是有中间立场吗?我可以标记一些符号并使链接器始终为可执行文件选择它们,而其余符号仅在需要时添加吗?

动机:我使用一些静态块在工厂中注册类。我想让我的代码可以作为(非动态)库使用,而用户代码不必为要填充的工厂执行任何“魔咒”。

一些相关的问题:

c++ linker static-block ld abstract-factory

5
推荐指数
1
解决办法
242
查看次数