【问题标题】:error: unused variable (struct)错误:未使用的变量(结构)
【发布时间】:2018-06-09 18:20:54
【问题描述】:
error: unused variable 'part2' [-Werror,-Wunused-variable]

该错误仅发生在 part2 中,即使它也已被初始化,只是方式不同。只是编译器的问题吗?

int main(void)
{
    struct complex
    {
        int a;
        int b;
    };

    struct complex part1;
    part1.a = 2;
    part1.b = 3;

    struct complex part2 = {4, 5};

    struct complex part3 = {part3.a = 7, part3.b = 8};
}   

【问题讨论】:

  • 如果您对 part3 的初始化有未定义的行为,我不会感到惊讶。
  • "只是编译器的问题吗?" -- 鉴于未使用的变量是完全标准的,并且您特别要求让您的编译器针对完全标准的代码发出错误消息,我想说这与其说是编译器问题,不如说是用户问题......
  • part1 被初始化,然后被使用(通过为其字段分配值)。 part2 已初始化但未使用。
  • 我被告知 part2 未使用,part1 已设置但未使用 ([-Werror=unused-but-set-variable])。 part3 初始化程序很奇特。它使用7part3.a 的赋值结果来初始化.a 成员——它不是指定的初始化器。它接近于未定义的行为,修改 .a 两次。

标签: c gcc struct unused-variables


【解决方案1】:

正如上面 cmets 中提到的,part1 被视为“已使用”,因为您在以下几行中明确为其字段(ab)分配值:

part1.a = 2;
part1.b = 3;

part2 从未使用过,仅在以下行中初始化:

struct complex part2 = {4, 5};

part3 更有趣,我很惊讶你的编译器没有抛出错误。通过执行以下操作:

struct complex part3 = {part3.a = 7, part3.b = 8};

您首先分配part3.a = 7part3.b = 8,然后将这些分配的结果用于初始化结构(part3.a = 7 计算为7part3.b = 8 计算为8)。它实质上变成了以下一组语句:

part3.a = 7;
part3.b = 8;
struct complex part3 = {7, 8};

我希望您的编译器会抛出一个错误,因为您在实例化之前尝试将值分配给 part3 的字段。这是未定义的行为。

【讨论】:

  • 非常感谢!我所做的第 3 部分初始化就像为数组指定的初始化程序,但针对的是结构体。我是从我正在学习的这本书中了解到的,C: A Modern Approach。所以我认为它应该是有效的。
  • @callmeanythingyouwant “我所做的第 3 部分初始化就像数组的指定初始化程序,但对于结构体”——不,不是。使用指定的初始化器,它看起来像struct complex part3 = {.a = 7, .b = 8};
  • 嘿,是的。我必须检查以确保您是对的。它现在会留在我的脑海里,谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 2017-03-09
  • 2011-12-23
  • 1970-01-01
相关资源
最近更新 更多