在第 6 章的开头:Brian W. Kernighan 和 Dennis M. Ritchie 的书的结构,有一段我看不懂。
ANSI 标准所做的主要更改是定义结构分配 - 结构可以被复制和分配,传递给函数,并由函数返回。大多数编译器多年来一直支持这一点,但现在已经精确定义了这些属性。现在也可以初始化自动结构和数组。
现在也可以初始化自动结构和数组是什么意思?我很确定应该手动初始化自动的,即局部变量。你能帮我理解它的意思吗?
在第 6 章的开头:Brian W. Kernighan 和 Dennis M. Ritchie 的书的结构,有一段我看不懂。
ANSI 标准所做的主要更改是定义结构分配 - 结构可以被复制和分配,传递给函数,并由函数返回。大多数编译器多年来一直支持这一点,但现在已经精确定义了这些属性。现在也可以初始化自动结构和数组。
现在也可以初始化自动结构和数组是什么意思?我很确定应该手动初始化自动的,即局部变量。你能帮我理解它的意思吗?
在准标准 C 中(意思是“在 C89 标准之前”,或者很久以前),你不能这样写:
int function(int i)
{
int array[4] = { 1, 2, 3, 4 };
struct { int x; int y; } x = { 1, 2 };
struct { int x; int y; } a[] = { { 2, 3 }, { 3, 4 } };
...code using array, x, a...
return x.y + a[!!i].x + array[3];
}
现在你可以做所有这些了。
此外,在 K&R 第 1 版 C(大约 1978 年)中,不允许您编写:
int another()
{
struct { int x; int y; } a, b;
a.x = 1;
a.y = 0;
b = a; /* Not allowed in K&R 1 */
some_other_func(a, b); /* Not allowed in K&R 1 */
some_other_func(&a, &b); /* Necessary in K&R 1 */
...
}
您也可以只返回指向结构的指针(以及传递指向结构的指针)。IIRC,一些 C 编译器实际上允许使用非指针表示法,但将幕后的代码转换为使用指针。然而,在标准发布之前(在 K&R 1 发布后不久),结构分配、结构传递和结构返回限制已从 C 中删除。但并非所有编译器都支持这些功能,因为没有标准让它们符合。
这意味着您可以执行以下操作:
typedef struct { int a; float b; } foo;
int main(void) {
foo f = { 42, 3.14 }; // Initialization
...
}