簡體   English   中英

是否可以確保std :: cout初始化?

[英]Is std::cout guaranteed to be initialized?

我對C ++的了解是,不應假定全局實例的構造(和銷毀)順序。

當我使用在構造函數和析構函數中使用std::cout的全局實例編寫代碼時,我遇到了一個問題。

std::cout也是iostream的全局實例。 是否可以確保在其他全局實例之前初始化std::cout

我編寫了一個簡單的測試代碼,它可以完美運行,但是我仍然不知道為什么。

#include <iostream>

struct test
{
    test() { std::cout << "test::ctor" << std::endl; }
    ~test() { std::cout << "test::dtor" << std::endl; }
};

test t;

int main()
{
    std::cout << "Hello world" << std::endl;
    return 0;
}

它打印

test::ctor
Hello world
test::dtor

代碼是否有可能無法按預期運行?

根據您使用的是C ++ 03還是C ++ 11,答案會有所不同。

在C ++ 11中,保證您的代碼可以工作,但是在C ++ 03中,未指定代碼; 您唯一的保證是,在輸入main() ,已經初始化了標准流。 (也就是說,所有主流實現在運行任何動態初始化之前都會對其進行初始化,以使其易於使用。)

您可以通過構造std::ios_base::Init對象來強制初始化,如下所示:

#include <iostream>

struct test
{
    test() { std::cout << "test::ctor" << std::endl; }
    ~test() { std::cout << "test::dtor" << std::endl; }

private:
    std::ios_base::Init mInitializer;
};

test t;

int main()
{
    std::cout << "Hello world" << std::endl;
    return 0;
}

現在,當test構造時,它將初始化mInitializer並確保流准備就緒。

C ++ 11通過充當#include <iostream>每個實例后跟static std::ios_base::Init __unspecified_name__;解決此煩人的行為static std::ios_base::Init __unspecified_name__; 這將自動保證可以使用流。

根據§27.3/ 2

構造對象[std :: cin,std :: cout等],並在構造ios_base :: Init類的對象之前或第一次期間的某個時間以及在任何情況下,在建立之前建立關聯。主要主體開始執行。

您的問題與靜態對象的構造順序有關。 我相信語言規范會使其保持未定義狀態。

GCC具有init_priority屬性以處理訂單。

我相信您在實踐中不必擔心那么多。

暫無
暫無

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

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