为什么不能在 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

Why can't you initialize point.x and point.y outside of main()?

你可以,using static initialization - but you can't call a function or perform impure operations. When using static-initialization prior to C99 you need to ensure fields are set in the correct order, while C99 and later allow for designated initializers 允许任意字段初始化。

函数外的 C 代码不是可执行指令 - 它们是静态声明,因此它们没有定义的求值顺序。

作为一个思想实验,考虑一下:

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 函数开始,每个执行代码都必须在一个函数中。

所以如果你想初始化一个结构的值,你应该在主函数中这样做。

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

你写的表格是不是初始化;它是一个未初始化(或者更确切地说默认初始化为零)的声明和定义,后跟有效范围之外的赋值语句。

如果要按名称初始化成员,写:

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

其他答案(正确地)解释说 方法可以通过 main 之外的命名成员静态初始化结构,但我想添加,对于 OP 或其他

这里的基本思想是 C 不允许在函数之外执行语句(“代码”)。一个新的 C 程序员可能来自另一种语言,在这种语言中,代码在某种程度上经常在“全局范围”中执行,并且您可以根据需要在这里或那里定义函数或设置变量。 C 比这更古老,也更结构化。有全局变量(比如你的 point),它们是你在任何特定函数之外声明的东西,但你不能真正地用全局 space 本身中的那些变量“做事”,除非表明它们的初始值(静态初始化)。

C 不会“运行 通过文件按顺序执行它找到的所有内容”——每个文件都被编译成一个目标代码单元,然后与其他单元链接在一起 main 是(本质上)执行的入口点,它依次调用其他函数,依此类推——当您的代码 运行ning 时,它总是在某处函数的“内部”。

文件中声明和定义的顺序在 C 语言中确实很重要,但这本质上是为了编译器的方便,而不是因为事情是按 [=30] 的顺序“执行”或“求值”的=]时间。 (当你的代码开始执行时,它已经完全变成了其他东西,原始文件中的语句顺序基本上从视图中消失了。)

所以!尽管如此:在程序初始化时预先设置全局变量的值是有用的,而且通常是可取的。所以静态初始化有点特殊,因为它有点 看起来像 可执行语句但不是,因此它传统上有一个愚蠢的语法。我们有那种奇怪的有序 = {2, 3} 语法,现在有更多的命名成员可以帮助您完成这种静态初始化。但您仍应将其视为静态(一次性、固定)初始化,而不是在全局执行赋值 space,因为那不是您实际在做的事情。