У меня есть C -кодовая база, которая использует профсоюзы для типа. Затем я проведен модульный тестирование этого кода в C ++ с помощью GMOCK. < /P>
Я знаю, что тип, основанный на объединении, наказание нелегально в C ++, поэтому я хотел убедиться, что мое использование безопасно: < /p>
Код: Выделить всё
// sum_halves.h
#include
uint32_t sum_halves(unit64_t i);
< /code>
// sum_halves.c
#include "sum_halves.h"
uint32_t sum_halves(unit64_t i) {
union {
uint64_t u64;
uint32_t u32[2];
} u;
u.u64 = i;
return u.u32[0] + u.u32[1];
}
< /code>
// sum_halves_test.cpp
extern "C" {
#include "sum_halves.h"
}
#include
TEST(sum_halves_test, two_plus_two_is_five) {
EXPECT_EQ(sum_halves(0x0000'0002'0000'0003), 5);
}
Насколько я понимаю, поскольку sum_halves.c составлен в качестве программы C, наказание типа на основе профсоюза является правильным, даже если я позже вызову эту функцию из кода C ++. Но если бы я сделал sum_halves встроенную функцию, то она будет составлена в виде кода C ++ в *.cpp файлах, что приведет к неопределенному поведению. extern "c" не помогает, так как она влияет только на связь, а не компиляция. Флаг компилятора GCC или Clang или #pragma , чтобы разрешить наказание типа на основе союза в определенной функции?
Подробнее здесь:
https://stackoverflow.com/questions/795 ... d-c-c-code