运行时的 C 初始值设定项

C initializers in runtime

我对 C 初始化程序有疑问。如果我们使用像这样的初始化器:

int a[2] = {1, 3}; 

在静态存储变量中,我理解(认为)编译器会自动将该数据放入 elf 文件的 .data 中。但是当我们在一个函数中这样做来初始化一个将在堆栈中的变量时会发生什么?编译器是否在运行时生成 "fills" 该变量的代码?如果是这样,为什么我们不能做类似的事情:

struct mystruct {
    int x;
    int y;
};

int main(){

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

   return 0;
}

这只是语法问题。

从 C99 开始,您可以精确地做到这一点,但是您需要显式转换才能告诉编译器后面的 {...} 块是什么:

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

注意上面是赋值,不是初始化。所以下面也是合法的:

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

您需要区分功能不同的代码和句法不同的代码。编译器和语言设计者和作者首先关注提供特性,如静态数据、本地(堆栈)、....

次要考虑因素是 'syntactical sugar',即简化语法来完成已经可以完成的事情

以你的例子

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

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

你可以说第一个更简单明了,但显然不够普遍。注意一种语言确实改变了语法。 C++ 将您的示例更改为

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

因为 typedef 结构如此普遍,以至于 c++ 决定自动生成结构和 类 类型。

编辑:我注意到有人为您的初始化程序输入了正确的语法。我对此的看法是,这并不是真的更简单:语法有点复杂这一事实迫使读者管道中出现了泡沫。而且它也没有节省多少打字时间