簡體   English   中英

靜態對象的構造函數未被調用

[英]Static object's constructor not being called

我有一個定義兩個對象的頭文件:

// header.h
static A object1("param1", "param2");
static A object2("param1", "param2");

這是A的樣子:

class A {
    public:
    int random;
    A(char* p1, char* p2){
        printf("Called constructor for %s | %s\n", p1, p2);
    }
};

但是,構造函數永遠不會被調用。 我正在這樣做:

#include "header.h"

int main(){
    // to prevent optimization issues
    object1.random = rand();
    if (object1.random != 3) { printf("\n"); }
    return 0;
}

而且我從沒有在控制台上看到消息,只是保持空白。

我已經讀過static initialization order fiasco ,但是我相信這不是問題,因為這些對象都不依賴另一個,所以順序並不重要...

我在Windows 7 x64上使用MSVC ++ 2013

靜態C ++類成員何時初始化? 包含有關此主題的好答案。

簡而言之,有3種保證(引用上述問題的原始Tadeusz Kopec答案):

  1. 在相同翻譯單元(通常表示.cpp文件)中定義的對象按其定義順序進行初始化
  2. 在使用翻譯單元中的任何對象或功能之前,將先完成翻譯單元中靜態對象的初始化。
  3. 它們將在輸入main之前初始化。

如果在您的特定情況下,靜態變量object1object2沒有初始化,則可能與編譯器優化有關,而忽略了未使用變量的初始化。 您可以通過在main內部添加這些變量的用法來輕松驗證這一點,並觀察它們是否已初始化以及何時初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM