亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在嘗試用const初始化變量時出錯“初始化器元素不是常量”

在嘗試用const初始化變量時出錯“初始化器元素不是常量”

C++ C
郎朗坤 2019-06-09 16:49:03
在嘗試用const初始化變量時出錯“初始化器元素不是常量”我在下面的程序的第6行(將my_foo初始化為foo_init)上有一個錯誤,我不知道為什么。typedef struct foo_t {     int a, b, c;} foo_t;const foo_t foo_init = { 1, 2, 3 };foo_t my_foo = foo_init;int main(){     return 0;}請記住,這是我正在處理的一個更大、多文件項目的簡化版本。目標是在對象文件中有一個常量,多個文件可以用來初始化狀態結構。因為它是一個資源有限的嵌入式目標,而且結構也不是那么小,所以我不想要源代碼的多個副本。我不想用:#define foo_init { 1, 2, 3 }我還試圖編寫可移植代碼,所以我需要一個有效的C89或C99解決方案。這與對象文件中的org有關嗎?初始化變量進入一個ORG并通過復制第二個ORG的內容進行初始化?也許我只需要改變我的策略,讓一個初始化函數在啟動時完成所有的副本。除非有其他的想法?
查看完整描述

3 回答

?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

在C語言中,具有靜態存儲持續時間的對象必須用常數表達式或者使用包含常量表達式的聚合初始化器。

“大型”對象絕不是C中的常量表達式,即使該對象聲明為const.

此外,在C語言中,“常量”一詞指的是文字常數(比如1'a'0xFF(等等)、枚舉成員和操作符的結果,例如sizeof..Const-限定對象(任何類型的)是非常數用C語言術語。它們不能用于具有靜態存儲持續時間的對象的初始化器中,而不管它們的類型如何。

例如,這是常數

const int N = 5; /* `N` is not a constant in C */

上述N在C+中是常數,但在C中不是常量,所以,如果您嘗試執行

static int j = N; /* ERROR */

您將得到相同的錯誤:嘗試用非常量初始化靜態對象。

這就是為什么在C語言中我們主要使用的原因#define聲明命名常量,并訴諸于#define若要創建命名聚合初始化器,請執行以下操作。


查看完整回答
反對 回復 2019-06-09
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

這是語言的限制。第6.7.8/4節:

具有靜態存儲持續時間的對象的初始化程序中的所有表達式都應該是常量表達式或字符串文本。

在第6.6節中,規范定義了必須視為常量表達式的內容。它不說明Const變量必須被視為常量表達式。編譯器對此進行擴展是合法的(6.6/10 - An implementation may accept other forms of constant expressions但這將限制可移植性。

如果你能改變my_foo所以它沒有靜態存儲,您可以:

int main(){
    foo_t my_foo = foo_init;
    return 0;}


查看完整回答
反對 回復 2019-06-09
  • 3 回答
  • 0 關注
  • 831 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號