2015-10-19 116 views
1

我對C初始值設定項有疑問。如果用戶的初始化,如:運行時C初始值設定項

int a[2] = {1, 3}; 
在靜態存儲變量

,我明白了(認爲)編譯器提出的是,在ELF文件的.data自動數據。但是當我們在一個函數裏面做一個初始化一個變量的時候會發生什麼?編譯器是否會生成在運行時「填充」該變量的代碼?如果是這樣,爲什麼我們不能這樣做:

struct mystruct { 
    int x; 
    int y; 
}; 

int main(){ 

    struct mystruct foo; 
    foo = {1, 2}; 

    return 0; 
} 
+0

因爲你可以用';'來終止'main' :-) – ameyCU

+2

_編譯器是否生成在運行時「填充」該變量的代碼?_你爲什麼不問問編譯器它是什麼呢?編譯一個簡單的函數並查看編譯器生成的程序集。 – mah

+0

@ameyCU不,你不能。 :-) – Downvoter

回答

-1

您需要區分功能上不同的代碼和語法上不同的代碼。編譯器和語言設計者和編寫者首先專注於提供靜態數據和本地(堆棧)等功能。......

第二個考慮因素是'語法糖',它是簡化句法來完成某些已經可以完成的操作

在你的榜樣

struct mystruct foo; 
    foo = {1, 2}; 

相同

struct mystruct foo; 
    foo.x = 1; 
    foo.y = 2; 

你可以爭辯說,第一個是簡單明瞭,b ut顯然不夠普遍。注意一種語言確實改變了語法。 C++將您的示例更改爲

mystruct foo; 
    foo.x = 1; 
    foo.y = 2; 

因爲typedef結構非常常見,所以C++決定自動生成結構和類類型。

編輯:我注意到有人把你的初始化的正確語法。我的觀點是,這並不簡單:語法有點複雜的事實迫使讀者流水線泡沫。並且它不會節省太多的輸入

2

這只是一個語法問題。

由於C99,你可以做的正是,但你需要有明確的轉換,以告訴編譯下面的{...}塊:

foo = (struct mystruct){1, 2}; 

注意的是,以上的分配,而不是初始化。因此,以下內容也是合法的:

for (int i = 0; i < 10; ++i) { 
    foo = (struct mystruct){i, 2*i}; 
    // Do something with foo 
} 
相關問題