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



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

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

我的问题是VSCode C/C++扩展的intellisense。代码编译正常,但intelligense在识别此函数时遇到了一些问题。它与HRESULT没有问题,但对于CoCreateInstance(),它显示"identifier is undefined"

所以我试着查看头文件本身,发现问题是intellisense识别出文件中的一些错误,不让我使用该函数,因为它认为它没有正确声明。它对HRESULT并没有问题,因为它只是一些简单的typedef,它可以理解。然而,CoCreateInstance()被声明为:

WINOLEAPI CoCreateInstance( //...

其中WINOLEAPI是包含类似的宏

extern __declspec(dllimport) int __stdcall

我假设__declspec__stdcall是一些特定于Windows的关键字,而intellisense只是无法识别这些关键字,检测到一个错误,这使得函数未声明,因此出现了"identifier is undefined"错误。

这是问题的原因吗?如果是这样的话,有没有什么方法可以"教会"intellisense一些关于windows特定关键字的东西?毕竟它是微软的扩展,我不知道为什么它不能识别微软的C语言扩展。

更新

我找到了一个临时的解决办法。请参阅下面的答案。

更新:澄清

似乎combaseapi.hobjbase.h都包含了它们所需的所有依赖项,因为即使是智能感知也能够将__declspec(和__stdcall(识别为某些"int __declspec",但它无法理解类型被其他关键字包围的语法。它在WINOLEAPI宏上给了我一个"显式类型丢失"的错误。当我将宏的值显式地替换为"extern __declspec(dllimport) int __stdcall"时,会出现类似"missing ;"的错误。它似乎不理解这样的语法。

在obbbaseapi.h 上添加#include <windows.h>

windows.h包括所需的定义,如HRESULT(实际上来自winerror.h,但包括windows.h应该考虑它的从属项等(

我找到了一个临时的解决方法。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__时(它不是在编译代码时定义的,而是仅在intellisense检查文件时定义的(,它会从WINOLEAPI宏中删除无法识别的关键字。

不过,最好在我的代码中应用一些类似的修复程序,而不是修改包含的头。此外,这只修复了这种特殊情况,任何其他不受支持的关键字都必须单独处理。在我的例子中,它修复了这两个头文件中的所有问题。

它是有效的,但如果有人能提供更好的解决方案,我将不胜感激。

相关内容

  • 没有找到相关文章

最新更新