初始化列表中不应存在重复的指派符
6.6.3 ID_repeatedDesignator
在 C 语言的初始化列表中,可以通过指派符(designator)对指定的结构体成员或数组元素进行初始化,应注意重复的指派符会使其指定的对象被重复初始化,往往意味着笔误或复制粘贴错误。
示例:
struct T { int x, y; };
struct T obj = { .x = 0, .x = 1 }; // Non-compliant
int arr[3] = { [0] = 0, [1] = 1, [1] = 2 }; // Non-compliant
例中重复的指派符 .x 和 [1] 是没有意义的。
C++20 对类对象的初始化也引入了指派符,但要求更为严格,重复的或颠倒次序的指派符无法通过编译,如:
struct T { int x, y; };
T a { .y = 0, .x = 1 }; // Compile error in C++20
T b { .x = 0, .x = 1 }; // Compile error in C++20
T c { .x = 0, .y = 1 }; // OK
依据
ISO/IEC 9899:1999 6.7.8(6 7)
ISO/IEC 9899:2011 6.7.9(6 7)
参考
MISRA C 2012 9.4