繁体   English   中英

VSCode C / C ++ Intellisense和Windows特定的库

[英]VSCode C/C++ Intellisense and Windows specific libraries

我正在尝试在C ++中使用某些Windows特定的库(在我的C ++代码中使用C库)。 我正在尝试为CoCreateInstance()函数包括objbase.h

#include <objbase.h>
// ...
HRESULT hr = CoCreateInstance(/* ... */);

我的问题是VSCode C / C ++扩展的智能感知。 代码可以编译,但是智能感知在识别此功能时存在一些问题。 HRESULT没问题,但是对于CoCreateInstance()它显示"identifier is undefined"

因此,我试图查看头文件本身,然后发现问题是,Intellisense识别出文件中的某些错误并且不允许我使用该函数,因为它认为该函数未正确声明。 HRESULT没问题,因为它只是一些简单的typedef ,它可以理解。 但是, CoCreateInstance()声明为:

WINOLEAPI CoCreateInstance( //...

WINOLEAPI是包含WINOLEAPI内容的宏:

extern __declspec(dllimport) int __stdcall

我假设__declspec__stdcall是一些Windows特定的关键字,并且intellisense根本无法识别那些关键字,从而检测到错误,从而使函数未声明,因此出现"identifier is undefined"错误。

这是问题的原因吗? 如果是这样,有什么办法可以“教”有关这些Windows特定关键字的智能感知吗? 毕竟这是Microsoft的扩展,我不知道为什么它不能识别Microsoft的C语言扩展。

更新资料

我找到了一个临时修复程序。 请参阅下面的答案。

更新:澄清

似乎combaseapi.hobjbase.h包含了它们所需的所有依赖项,因为即使intellisense也能够将__declspec (和__stdcall )识别为某些"int __declspec"但无法理解语法,其中类型是被其他关键字包围。 它使我在WINOLEAPI宏上出现“缺少显式类型”错误。 当我用宏的值明确替换为"extern __declspec(dllimport) int __stdcall"替换宏时,它给了我类似"missing ;"错误"missing ;" 看来,它不理解这种语法。

我找到了一个临时解决方法。 WINOLEAPI宏在combaseapi.h文件中定义。 我将这些行添加到WINOLEAPI定义之后的文件中:

// Original content of the file:
#ifdef _OLE32_
#define WINOLEAPI STDAPI
#define WINOLEAPI_(type) STDAPI_(type)
#else
#define WINOLEAPI EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
#define WINOLEAPI_(type) EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE
#endif

// Added fix for VSCode intellisense:
#ifdef __INTELLISENSE__
#define WINOLEAPI EXTERN_C HRESULT
#define WINOLEAPI_(type) EXTERN_C type
#endif

现在,当定义了__INTELLISENSE__时(在编译代码时未定义,而仅在智能检查文件时才定义。),它从WINOLEAPI宏中删除了无法识别的关键字。

最好在我的代码中应用一些类似的修复方法,而不用修改包含的标头。 同样,这仅解决了这种特殊情况,任何其他不受支持的关键字都必须单独处理。 就我而言,它解决了这两个头文件中的所有问题。

它可以工作,但是如果有人提供更好的解决方案,我仍然感激不尽。

在objbaseapi.h上方添加#include <windows.h>

windows.h包含必需的定义,例如HRESULT (实际上来自winerror.h,但包括windows.h应该照顾它的依赖项等)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM