通过回退到 C 的 C++ 类型双关语

C++ type punning via fallback to C

我看了这个很棒的视频

https://www.youtube.com/watch?v=_qzMpk-22cc

我想知道我们是否可以这样做而不是奇怪 memset hack:

https://gcc.godbolt.org/z/uOmzBD

struct S{
    int a;
};

extern "C"{

static void fix(S *s){
    int *x = (int *) s;
    *x = 5;
}

}

int main(){
    S s;

    fix(&s);

    return s.a;
}

这种回退到 C 似乎是完全合法的?

(请不要评论这种类型双关在C++11及以上是合法的)

extern "C"只适用于符号的链接,它不会改变C++的规则。

如果它是 C++ 中的 UB(确实如此),那么它就是 UB,将它放在 extern "C" 函数中不会改变这一点。如果函数体是由 C++ 编译器编译的,它仍然受 C++ 规则的约束。

但是,如果函数体位于用 C 编译的单独库(甚至 CU)中,则函数体受 C 规则约束。我不能肯定地说,但我认为这也是 C 中的 UB。