簡體   English   中英

為什么我們不允許在切換情況下甚至使用全局const限定變量?IBM支持門戶網站提示我們可以

[英]Why aren't we allowed to use even global const qualified variables in switch-case?IBM support portal hints we can

呵呵,它變得如此混亂。下面的IBM Support Portal鏈接似乎表明我們不能將const限定變量用作常數的原因是因為它們的生存時間與程序本身的生存時間不同。僅局部變量和全局變量具有與程序相同的生存期。 IBMLINK )。它的確切含義是:

An object that is declared const is guaranteed to remain constant for its lifetime, not throughout the entire execution of the program. For this reason, a const object cannot be used in constant expressions.

但在隨后的程序,因為壽命const限定的變量是相同的程序,當我使用它之后,為什么我仍然得到錯誤的執行的case開關case語句,這個常數預期它給出以下錯誤:

| 11 |錯誤:案例標簽未減少為整數常量|

#include<stdio.h>

const int x=2;

int main(void)
{

switch(2)
{
    case 1:
    printf("Hello");
    break;
    case x:
    printf("Hola");
}

}

C對可以在常量表達式中使用的內容進行嚴格限制的原因是允許:

  1. 簡單的編譯器實現,
  2. 簡單的鏈接器實現,以及
  3. 高效的代碼生成

對於具有內部鏈接的全局const限定變量,允許它們以常量表達式表示不會太昂貴。 它不必影響上面的項目2和3,而只影響項目1。但是一般來說(可能是外部鏈接),允許它們意味着:

  1. 編譯器需要留出一定的余量(某種方式的重定位),以便不僅解析地址,而且解析鏈接時該地址的 通常,此問題與標准不需要的一次完整編程/鏈接時間優化一樣困難。 在某些特殊情況下,可能不需要如此強大的解決方案。

  2. 鏈接器必須能夠處理基於重定位的復雜表達式的求值:不僅僅是地址常量,而且還有值,從而可以合法地從這些值派生所有表達式。

  3. 在使用switch的情況下,如果編譯器不知道case標簽的值,則都將不考慮有效的實現(跳轉表或條件樹的二進制樹)。 這可以通過將所有工作移至鏈接時(一次編程/ LTO)來解決。

我認為您正在將自己的信息讀入該報價中。

確保聲明為const的對象在其生命周期內保持不變,而不是在程序的整個執行過程中保持不變。 因此,不能在常量表達式中使用const對象。

這是在第二句話說, 沒有一個const對象在常量表達式允許,根本沒有。

第一個句子中給出了它的原因,盡管我們可以設想可能以這種方式使用const對象的情況,但絕不會改變確定的第二個句子。

這與學前禁止所有狗只沒有太大的不同,因為更具攻擊性的狗可能會咬傷孩子。


C標准規定了這種行為,因此您實際上不應反對IBM。 他們的文檔可能(在某些讀數)含糊,但他們做正確的事情。

在(C99) 6.8.4.2 The switch statement /3 ,我們看到:

每個case標記的表達式應為整數常量表達式,並且在轉換后,同一switch語句中的兩個case常量表達式均不得具有相同的值。

在同一標准的6.6 Constant expressions /6中,它因此定義了整數常量表達式:

整數常量表達式應具有整數類型,並且僅應具有整數常量,枚舉常量,字符常量,結果為整數常量的sizeof表達式的大小以及作為強制類型轉換的立即數的浮點常量。 整數常量表達式中的強制轉換運算符只能將算術類型轉換為整數類型,但作為操作數的一部分要轉換為sizeof運算符。

如您所見,這里沒有提到const變量。

問題在於x的值要等到運行時才能確定,但​​要在編譯時知道大小寫標簽表達式(和非VLA數組維),以便編譯器可以生成適當的代碼。 在編譯時,編譯器只知道x是標識符並且具有整數類型。 它沒有與之關聯的值。

暫無
暫無

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

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