相关疑难解决方法(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万
查看次数

在main()之前执行代码

在面向对象语言(C++)中,您可以main()通过使用全局对象或类静态对象来执行代码,并让它们的构造函数运行您想要的代码.

有没有办法在C中这样做?我没有任何具体问题我想解决,我只是好奇.这可能有用的一件事是自动初始化库.

c

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

gcc中的C++ 11风格[[unused]]属性?

在gcc/g ++ 4.9下我可以写:

int x __attribute__((unused)) = f();
Run Code Online (Sandbox Code Playgroud)

表示x是故意未使用的.

是否有可能以[[]]某种方式使用C++ 11 属性表示法?

我试过了:

int x [[unused]] = f();
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

(是的,我知道它是一个实现定义的属性.)

c++ gcc c++11

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

如何强制在库中包含"未使用的"对象定义

我的问题类似于这些,但似乎并没有完全相关:

如何在链接到可执行文件时强制将对象文件包含在静态库中?

使用MSVC强制符号导出

我得到的是这样的:

struct thingy;
struct container
{
  static container& instance(); // singleton

  int register_thingy(thingy*);
};

struct thingy
{
  virtual ~thingy() {}
  virtual int id() const = 0;
};

//template trick to force registration.
template < typename Derived >
struct registered_thingy : thingy
{
  registered_thingy() : my_id(my_static_id) {} 

  int id() const { return my_id; }
private:
  int my_id;
  static int my_static_id;
}
template < typename Derived >
int registered_thingy<Derived>::my_static_id = 
  container::instance().register_thingy(new Derived);
Run Code Online (Sandbox Code Playgroud)

现在,concrete_thingy.cpp我在一个文件中:

struct my_concrete_thingy : registered_thingy<my_concrete_thingy> …
Run Code Online (Sandbox Code Playgroud)

c++ linker

12
推荐指数
1
解决办法
5630
查看次数

标签 统计

c++ ×3

c ×1

c++11 ×1

equivalent ×1

gcc ×1

initialization ×1

java ×1

linker ×1

static-block ×1