通过回退到 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。
我看了这个很棒的视频
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。