1

我使用了一个QueryInterface函数,它将基于 IID 返回给定接口上的指针。

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**? 真的有问题吗?我不明白该警告背后的理性。

4

1 回答 1

4

这就是为什么就指针类型向编译器撒谎是不好的:

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);

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

于 2013-08-27T16:59:27.223 回答