簡體   English   中英

C 編譯器中的初始化元素不是常量

[英]Initializer element is not constant in C compiler

我試圖在任何函數之外執行此操作,但我得到:初始值設定項元素不是常量。

我能做什么?

typedef struct color
{
  const uint8_t alpha;
  const uint8_t red;
  const uint8_t green;
  const uint8_t blue;
}COLOR;

COLOR RED   = {0xF, 15, 0, 0};
COLOR GREEN = {0xF, 0, 15, 0};
COLOR BLUE =  {0xF, 0, 0, 15};

uint8_t alpha = RED.alpha;
uint8_t red   = RED.red;
uint8_t green = RED.green;
uint8_t blue  = RED.green;

謝謝!

靜態存儲對象初始值設定項必須是常量表達式。 常量對象或常量結構成員不是 C 中的常量表達式。

什么是常量表達式:

6.9 常量表達式

常量表達式是只包含常量的表達式。 可以在編譯期間而不是在運行時評估常量表達式,並且可以在常量可能出現的任何地方使用。 在以下示例中,limit+1 是一個常量表達式,並在編譯時計算:

 #define limit 500 char x[limit+1];

常量表達式不能包含賦值、遞增、遞減、函數調用或逗號運算符,除非它們在 sizeof 運算符的操作數內。 每個常量表達式的計算結果必須是在其類型的可表示值范圍內的常量。

有幾個上下文中 C 需要一個必須計算為常量的表達式:

  • 位域的大小
  • 枚舉常量的值
  • 數組的大小(以及所有數組聲明中的第二個和后續維度)
  • 案例標簽的價值
  • 條件包含預處理指令中使用的整數常量表達式
  • 具有靜態存儲持續時間的對象的初始化列表

6.9.1 積分常數表達式

整型常量表達式具有整型類型,並且僅包含整數常量、枚舉常量、字符常量、sizeof 表達式或作為轉換的直接操作數的浮點常量的操作數。 整數常量表達式中的強制轉換操作數僅將算術類型轉換為整數類型,除非作為操作數的一部分轉換為 sizeof 運算符。

C 為初始值設定項中的常量表達式提供了更大的自由度。 這樣的常量表達式可以計算為以下之一:

  • 算術常量表達式
  • 空指針常量
  • 地址常量
  • 對象類型的地址常量加上或減去整型常量表達式

6.9.2 算術常數表達式

算術常量表達式具有算術類型,並且僅包含整數常量、浮點常量、枚舉常量、字符常量或 sizeof 表達式的操作數。 算術常量表達式中的強制轉換運算符僅將算術類型轉換為算術類型,但作為 sizeof 運算符的操作數的一部分除外。

6.9.3 地址常量

地址常量是一個指向左值的指針,該左值指定一個靜態存儲持續時間的對象(見第 2.10 節),或指向一個函數指示符。 地址常量必須使用一元&運算符顯式創建,或使用數組或函數類型的表達式隱式創建。 數組下標[]和成員訪問運算符. -> 、地址&和間接*一元運算符以及指針強制轉換可用於創建地址常量,但不能使用這些運算符訪問對象的值。

以上來自: https : //www.cs.auckland.ac.nz/references/unix/digital/AQTLTBTE/DOCU_066.HTM

暫無
暫無

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

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