Tenho uma base de código C que usa uniões para trocadilhos de tipos. Estou então testando esse código em C++ com o gmock.
Sei que o trocadilho baseado em união é ilegal em C++ , então queria ter certeza de que meu uso é seguro:
// sum_halves.h
#include <stdint.h>
uint32_t sum_halves(unit64_t i);
// 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];
}
// sum_halves_test.cpp
extern "C" {
#include "sum_halves.h"
}
#include <gtest/gtest.h>
TEST(sum_halves_test, two_plus_two_is_five) {
EXPECT_EQ(sum_halves(0x0000'0002'0000'0003), 5);
}
Pelo que entendi, como sum_halves.c
é compilado como um programa em C, o trocadilho baseado em união está correto, mesmo que eu posteriormente chame essa função a partir de código C++. Mas se eu criasse sum_halves
uma função inline, ela seria compilada como código C++ em *.cpp
arquivos, resultando em Comportamento Indefinido. extern "C"
Isso não ajuda, pois afeta apenas a vinculação, não a compilação.
Se estiver correto, existe alguma solução alternativa para o caso inline? Uma flag do compilador GCC ou Clang ou #pragma
para permitir trocadilhos baseados em união em uma função específica?