运行时C初始值设定项
问题描述:
我对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;
}
答
您需要区分功能上不同的代码和语法上不同的代码。编译器和语言设计者和编写者首先专注于提供静态数据和本地(堆栈)等功能。......
第二个考虑因素是'语法糖',它是简化句法来完成某些已经可以完成的操作
在你的榜样
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++决定自动生成结构和类类型。
编辑:我注意到有人把你的初始化的正确语法。我的观点是,这并不简单:语法有点复杂的事实迫使读者流水线泡沫。并且它不会节省太多的输入
答
这只是一个语法问题。
由于C99,你可以做的正是,但你需要有明确的转换,以告诉编译下面的{...}块:
foo = (struct mystruct){1, 2};
注意的是,以上的分配,而不是初始化。因此,以下内容也是合法的:
for (int i = 0; i < 10; ++i) {
foo = (struct mystruct){i, 2*i};
// Do something with foo
}
因为你可以用';'来终止'main' :-) – ameyCU
_编译器是否生成在运行时“填充”该变量的代码?_你为什么不问问编译器它是什么呢?编译一个简单的函数并查看编译器生成的程序集。 – mah
@ameyCU不,你不能。 :-) – Downvoter