簡體   English   中英

為什么不能在 c 中初始化 main() 之外的結構值?

[英]why can't you initialize values of structs outside of main() in c?

我在 Visual Studio 中收到錯誤代碼:

struct coordinates {
    int x;
    int y;
};
struct coordinates point;
point.x = 5;
point.y = 3;

int main() {
    return 0;
}

如果我在main()中初始化point.xpoint.y和/或如果我給出這樣的點值,它會起作用: struct coordinates point = {5, 3} 為什么不能在main()之外初始化point.xpoint.y

你寫的表格不是初始化 它是一個未初始化(或者更確切地說是默認初始化為零)的聲明和定義,后跟有效的 scope 之外的賦值語句。

如果要按名稱初始化成員,請編寫:

struct coordinates point = {
    .x = 5,
    .y = 3,
};

其他答案(正確)解釋了有一些方法可以通過main外部的命名成員靜態初始化結構,但我想為 OP 或其他人添加。

這里的基本思想是 C 不允許函數之外的可執行語句(“代碼”)。 新的 C 程序員可能來自另一種語言,其中代碼在“全局范圍”中經常執行,您可以根據需要在這里和那里定義函數或設置變量。 C 比這更老,更結構化。 有全局變量(如您的point ),它們是您在任何特定 function 之外聲明的東西,但您不能真正在全局空間本身中對這些變量“做事”,除非指出它們的初始值(靜態初始化)。

C 不會“遍歷文件,按順序執行它找到的所有內容”——每個文件都被編譯成一個 object 代碼單元,然后與其他單元鏈接在一起, main是(本質上)執行的入口點,在turn 調用其他函數,依此類推——當你的代碼運行時,它總是在某個 function 的“內部”。

確實,在 C 中文件中的聲明和定義的順序很重要,但這本質上是為了編譯器的方便,而不是因為在運行時按該順序“執行”或“評估”事物。 (當您的代碼執行時,它已完全轉換為其他內容,原始文件中的語句順序基本上已從視圖中消失。)

所以:說了這么多。 在程序初始化時預先設置全局變量的值是有用的,並且通常是可取的。 所以 static 初始化有點特殊,因為它看起來像一個可執行語句但不是,因此它傳統上具有愚蠢的語法。 我們有那種奇怪的 ordered = {2, 3}語法,現在有更多的命名成員可以幫助您完成這個 static 初始化。 但是您仍然應該將其視為 static(一次性,固定)初始化,而不是在全局空間中執行分配,因為這不是您實際在做的事情。

為什么不能在 main() 之外初始化 point.x 和 point.y?

您可以使用 static 初始化- 但您不能調用 function 或執行不純操作。 在 C99 之前使用靜態初始化時,您需要確保以正確的順序設置字段,而 C99 及更高版本允許指定的初始化程序允許任意字段初始化。

function 之外的 C 代碼不是可執行指令 - 它們是 static 聲明,因此它們沒有定義的評估順序。

作為一個思想實驗,考慮一下:

int x;
int y;

x = 2;
y = 3;
y = x;
x = y;

int main() {
    
    return x; // what is returned?
}

也許您學習了 Javascript 但您是 c/c++ 的新手。 每個 c/c++ 程序都以main function 開頭,每個執行代碼必須在 function 中。

所以如果你想初始化一個struct的值,你應該在main function中做這個。

struct coordinates {
    int x;
    int y;
};
struct coordinate point;
int main(){
  point.x = 5;
  point.y = 3;
}

暫無
暫無

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

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