簡體   English   中英

可以用 static 常量初始化 static 變量嗎?

[英]Can a static variable be initialized with a static constant?

這個答案中,我基本上需要static int n = -1; 在 function 內。 我想避免到處都是幻數,所以我改用了這個:

double f(int i)
{
    static const int sentinel = -1;
    static int n = sentinel;

    if (n == sentinel)
    // ...
}

然而有人指出,這不符合標准,因為sentinel不是(編譯時)常數。

這對我來說很有意義,因為我知道常量整數可用於 C++ 中的編譯時表達式(例如數組的大小)。 但是 gcc、clang 和 icc >v16 編譯此代碼時沒有任何警告。 只有 icc <=v16 和 MSVC 會給出這個警告/錯誤(參見godbolt )。

C 標准怎么說? 這會在標准的不同版本(c90、c99、c11)之間發生變化嗎? 如果這不符合要求,我們能否在 gcc 和 clang 上收到警告? 如果它是一致的,為什么舊的 icc 和 MSVC 會出錯?

static const int sentinel = -1; static int n = sentinel; 符合 C 代碼。 它不嚴格符合 C 代碼。

C 2018 將嚴格符合的程序定義為“應僅使用本文檔中指定的語言和庫的那些功能”(C 2018 4. 5)。 嚴格符合標准的程序是那些只使用標准中完全定義的核心語言的程序。 它將符合標准的程序定義為“符合標准的實現可以接受”(4. 7)。 對於托管實現,一致實現是接受任何嚴格一致的程序 (4. 6) 的實現——即支持核心 C 語言但也可能具有擴展的任何編譯器或其他實現。

6.7.9 4 說“具有 static 或線程存儲持續時間的 object 的初始化程序中的所有表達式應為常量表達式或字符串文字。” sentinel顯然不是字符串文字。 是常量表達式嗎? 常量表達式在 6.6 中定義。 除了一個例外,它們的操作數必須是 integer 常量(即諸如37之類的文字)、產生 integer 常量的sizeof表達式、 _Alignof表達式、浮點常量、具有某些約束的枚舉常量、字符常量或一元&表達式. sentinel不是這些。

例外是第 10 段說“一個實現可以接受其他 forms 的常量表達式。” 因此,如果 GCC 和其他編譯器願意,可以自由地接受此代碼,因此,由於它被一致的實現接受,因此它是一致的代碼。 但是,由於它是否被接受是實現定義的,因此它不是嚴格符合的代碼。

這與 1990 年以前的 C 標准基本相似,盡管有一些細微的變化,例如_Alignof不在標准的早期版本中。

暫無
暫無

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

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