多个未排序的修改警告未应用于struct

时间:2016-09-29 08:58:34

标签: c

我发现多个未经检测的修改警告的奇怪例外。循环计数器时我遇到了警告:

int i = 0;
i = ++i & 0xFF; // <- warning
  

警告:对&#39; i&#39;

进行多次无序修改

我理解为什么这是未定义的行为。我发现虽然在使用struct member时没有应用此警告:

typedef struct
{
    int i;
}struct_t;

struct_t t;
t.i = ++t.i & 0xFF; // <- no warning

同样适用于指针:

struct_t *u;
u = &t;
u->i = ++u->i & 0xFF; // <- no warning

我在C99模式下使用MDK-ARM Plus版本5.21a。

我的问题是这是否是实际可接受的代码,由于某种原因,因为我使用的是结构,它不再是未定义的行为,或者是编译器警告只是缺少它。

1 个答案:

答案 0 :(得分:2)

就序列点而言,您的两个示例是相同的。它们都调用未定义的行为(根据6.5),因为i在同一个表达式中被修改两次,其间没有序列点。 i的数据类型并不重要,如果它是结构的一部分也不重要。

这是不可接受的代码。但是,编译器不需要为调用未定义行为的代码提供诊断。如果你确实得到了一个,那么编译器非常好。

您的编译器警告不一致的原因似乎是一个次要的编译器错误。