首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >警告C4090:“正在初始化”:不同的“__unaligned”限定符

警告C4090:“正在初始化”:不同的“__unaligned”限定符
EN

Stack Overflow用户
提问于 2017-02-18 01:31:47
回答 1查看 1.1K关注 0票数 2
代码语言:javascript
复制
 void file_explore(std::wstring str) {
     ITEMIDLIST *pIDL = ILCreateFromPath(str.c_str());
     if ( NULL != pIDL ) {
         SHOpenFolderAndSelectItems(pIDL , 0 , 0 , 0);
         ILFree(pIDL);
     } else {
         std::wstring p = str.substr(0 , str.find_last_of('\\'));
         ShellExecute(NULL , L"explore" , p.c_str() , NULL , NULL , SW_SHOWNORMAL);
     }
 }    

上面的编译对于32位没有警告,但是对于64位,我得到了警告,但是docs:https://msdn.microsoft.com/en-us/library/k77bkb8d.aspx声明这是一个c错误,我将为c++获取C2440,但我使用的是c++。

被投诉的代码行是:

代码语言:javascript
复制
 ITEMIDLIST *pIDL = ILCreateFromPath(str.c_str());

如何在64位版本中修复此问题?

EN

回答 1

Stack Overflow用户

发布于 2017-11-01 05:42:27

LPITEMIDLIST被定义为typedef ITEMIDLIST __unaligned *LPITEMIDLIST,因此将结果接受为ITEMIDLIST *将丢失__unaligned修饰符。我不确定这与32位和64位有什么关系。

正如Hans Passant所评论的那样,使用typedef解决了这个问题。在我的例子中,我使用的是std::unique_ptr,它需要基类型而不是指针,所以我需要一个非指针类型。因为它可能会让偶然发现这个答案的人感兴趣,所以我将把我是如何在ILCreateFromPath中使用std::unique_ptr的,包括为了好玩而定制的deleter:

代码语言:javascript
复制
auto deleter = [](LPITEMIDLIST ptr) { ILFree(ptr); };
using itemidlistptr_t = std::unique_ptr<
    std::remove_ptr_t<LPITEMIDLIST>, decltype(deleter)>;
auto dir = itemidlistptr_t(ILCreateFromPathW(folder.c_str()), deleter);

使用std::remove_pointer_t有点拐弯抹角,但我喜欢这里,而不是直接提到__unaligned

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42304078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档