C中的结构直接声明

structs direct declaration in C

这段代码有什么问题?我不明白为什么这不起作用。

struct point {
    int x;
    int y;
} eh;

void main() {
    eh = {1, 2};
    printf("%i", eh.x);
}

但这很好用

struct point {
    int x;
    int y;
} eh;

void main() {
    eh.x = 2;
    printf("%i", eh.x);
}

这种语法可能适用于其他一些语言,但在 C 中你应该这样写:

eh = (struct point){1, 2};

右边的表达式称为复合文字

在 C 中,赋值运算符需要一个表达式,但在此表达式语句中

eh = {1, 2};

花括号列表不是表达式。

花括号列表可用于对象的初始化。例如你可以写

struct point {
    int x;
    int y;
} eh = { 1, 2 };

struct point {
    int x;
    int y;
} eh = { .x = 1, .y = 2 };

或者你可以在 main 中使用像

这样的复合文字来分配结构类型的另一个对象
eh = ( struct point ){ 1, 2 };

eh = ( struct point ){ .x = 1, .y = 2 };

复合文字创建了一个类型为 struct point 的未命名对象,该对象分配给了对象 eh。一个结构类型的对象可以分配给相同结构类型的另一个对象。

你也可以用复合文字初始化对象 eh

struct point {
    int x;
    int y;
} eh = ( struct point ){ .x = 1, .y = 2 };

注意根据C标准,不带参数的函数main应该声明为

int main( void )

这也行得通:

#include <stdio.h>

struct point {
    int x;
    int y;
};

int main(void) {
    struct point eh = {1, 2};
    printf("%i", eh.x);
}

请注意,我删除了一些东西,添加了 stdio.h 包含并修复了 main 函数类型和参数。