gpt4 book ai didi

c++ - 海湾合作委员会警告 "dereferencing type-punned pointer will break strict-aliasing rules"

转载 作者:太空宇宙 更新时间:2023-11-04 01:33:51 24 4
gpt4 key购买 nike

我使用一个 QueryInterface 函数,它会根据 IID 返回给定接口(interface)上的指针。

DecodingFramework::IVariableFramerate* pInt = NULL;
DecodingFramework::DecodeResult iVFR = pVideoDescription->QueryInterface(IID_IVariableFramerate, (void**)(&pInt));
if(pInt != NULL && iVFR == DF_SUCCESS)
{
//use the IVariableFramerate interface using pInt
}

但在该代码中 (void**)(&pInt) 会产生一个错误消息 dereferencing type-punned pointer will break strict-aliasing rules

我将代码更新为以下内容:

void* pInt = NULL;
DecodingFramework::DecodeResult iVFR = pVideoDescription->QueryInterface(IID_IVariableFramerate, &pInt);
if(pInt != NULL && iVFR == DF_SUCCESS)
{
DecodingFramework::IVariableFramerate* pVideoVFR = reinterpret_cast<DecodingFramework::IVariableFramerate*>(pInt);

//use the IVariableFramerate interface using pVideoVFR
}

我发现了很多与该警告消息相关的问题,但主要是在将更复杂的数据转换为 void** 的地址指针时?真的有问题吗?我不明白该警告背后的合理性。

最佳答案

这就是为什么对编译器说指针类型是不好的:

struct SomeClass { int a; };
SomeClass* global_pointer;

void open_object( void** result, int x )
{
cout << global_pointer->a;
*result = new SomeClass{x};
cout << global_pointer->a;
}

完全允许编译器将其替换为:

auto temp = global_pointer->a;
cout << temp;
*result = new SomeClass{x}; // according to the Standard, the compiler is allowed to assume this line CANNOT change global_pointer, because the type is wrong
cout << temp;

如果你再打电话

open_object((void**)&global_pointer);

那么你可能会对结果感到惊讶。

关于c++ - 海湾合作委员会警告 "dereferencing type-punned pointer will break strict-aliasing rules",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18469660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com