使用union通过extern“C”函数在C ++中输入punning

时间:2017-11-13 14:12:23

标签: c++ type-punning

将连续字节转换为其他类型对象的普遍问题可以使用联合在C中解决。由于活动成员定义,这在C ++中是不可能的。

因此,在下面的片段中,实际的“双关语”由C函数完成。我想知道这是否正确?这肯定取决于“extern”关键字的含义。

#include <cstdint>
#include <cstddef>
#include <string.h>

namespace Util {
    namespace detail {
        union Punn {
            std::byte small[sizeof(uint32_t)];
            uint32_t  big;
        };
    }
    extern "C" {
    inline uint32_t read(const Util::detail::Punn* u) {
        return u->big;
    }
    }
}

int main() {
    Util::detail::Punn a;
    a.small[0] = std::byte{1};
    a.small[1] = std::byte{2};
    a.small[2] = std::byte{3};
    a.small[3] = std::byte{4};

    auto x = Util::read(&a);

    return x;
}

我知道这个问题的两个真正的保存解决方案是shift或memcpy()。所以,请只使用extern“C”函数来争论上面的代码。 (旁白:生成的汇编代码在g ++上是正确的,但这并不意味着它严格符合。)

0 个答案:

没有答案