【问题标题】:Why doesn't this array of structure assignment compile?为什么这个结构赋值数组不能编译?
【发布时间】:2014-10-30 06:09:25
【问题描述】:
here is the code 

struct point_tag {
        int x;
        int y;
};

typedef struct point_tag Point;

int main(void) 
{
      Point pt[] = { {10,20}, {30, 40}, {50,60}};
      pt[0] = {100,200};
}

当我执行pt[0] = {100, 200} 时,编译器一直在抱怨

错误:“{”标记之前的预期表达式

不过,我真的不明白。 {令牌赋值运算符(=)之前的表达式不是吗?

我不明白为什么分配会是一个问题。地址 pt 处的值指的是一个 Point 数组。我只是将第 0 个点设置为这个新点,并且我知道以 {100,200} 之类的格式分配结构是合法的,其中该数组中的元素只是字段。

【问题讨论】:

    标签: c arrays struct


    【解决方案1】:

    对于赋值,将值类型转换为类型 Point 以使其成为 compound literal:

    pt[0] = (Point){100,200};
    

    Live code 使用 gcc

    这相当于

    {
      Point temp = {100,200};
      pt[0] = temp;
    }
    

    附言。复合文字在旧的严格 C89 兼容编译器中不可用。它在 GCC 中可用于 C89 作为扩展,而在 C99 中复合文字是核心功能。

    【讨论】:

    • 您是否有理由不必为 {10,20}、{30,40} 和 {50,60} 执行此操作?那让我绊倒。从技术上讲,您仍在将这些值分配给数组中这些索引处的值
    • 因为上述构造仅可用于初始化。在pt[0] = (Point){100,200}; 中,您正在创建一个临时Point 并将其分配给pt[0]。您必须告诉编译器 {100, 200} 是 Point 还是 int [2] 或其他。
    • 但这难道不是类似的逻辑,因为您还创建了一个临时点 {10,20} 并将其存储为数组中第一个索引的值吗?
    • 如果我之前的评论未能回答您的问题,我建议您通读 C99 规范第 6.5.2.5 节复合文字。
    • @committedandroider 您还可以执行类似 [pt[0] = (Point){.x = 100, .y = 200};](ideone.com/Bkv5nu) 的操作。如果不告诉类型,编译器将不知道 x 和 y 是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2016-07-30
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2016-06-16
    相关资源
    最近更新 更多