我不確定代碼是否在asserts強制轉換中存在指針別名(或其他標準一致性問題)。看來,指向聯合類型的指針應該能夠轉換爲第一個成員的指針,並且因爲聯合只由這兩個結構組成,所以我認爲對第一個成員的轉換應該可行,但我不是確定如果這是正確的,或者如果我在這個過程中填充細節的細節。工會是否需要填充高位?與普通第一成員結合的結構體
看起來這是不明確的行爲?有沒有人有任何洞察力,這是否是支持的。我知道有利用結構與enum type
場和struct container_storage
成員這樣做的另一種標準的方式,但它似乎是浪費空間考慮,這個信息已經在struct contained
編譯命令在Linux中:gcc -std=c99 -Wextra -pedantic -fstrict-aliasing test.c && ./a.out && echo $?
返回0
#include <stdlib.h>
#include <assert.h>
enum type {type_a = 1, type_b = 2};
struct contained {
int some_other_field;
enum type type;
};
struct container_a {
struct contained contained;
int test;
};
struct container_b {
struct contained contained;
char test;
};
union container_storage {
struct container_a container_a;
struct container_b container_b;
};
int
main(int argc, char **argv)
{
union container_storage a =
{.container_a = {.contained = {.type = type_a}, .test = 42}};
union container_storage b =
{.container_b = {.contained = {.type = type_b}, .test = 'b'}};
assert(((struct contained *)&a)->type == type_a);
assert(((struct contained *)&b)->type == type_b);
return EXIT_SUCCESS;
}
參考文獻:
[1] gcc, strict-aliasing, and casting through a union
[2] What is the strict aliasing rule?
很高興聽到。我試圖挖掘C99規範,但我似乎無法在任何地方找到它。謝謝! – backscattered