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".

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

WINOLEAPI CoCreateInstance( //...

其中 WINOLEAPI 是一个包含如下内容的宏:

extern __declspec(dllimport) int __stdcall

我假设 __declspec__stdcall 是一些 Windows 特定的关键字,并且智能感知根本无法识别这些关键字,检测到错误,这使得函数未声明,因此"identifier is undefined" 错误。

这是问题的原因吗?如果是这样,是否有任何方法可以 "teach" 对那些 windows 特定关键字进行智能感知?毕竟是微软的扩展,不知道为什么不能识别微软的C语言扩展

更新

我找到了一个临时修复方法。请参阅下面我的回答。

更新:澄清

似乎 combaseapi.hobjbase.h 都包含了它们需要的所有依赖项,因为即使是智能感知也能够将 __declspec(和 __stdcall)识别为一些"int __declspec" 但无法理解语法,其中类型被其他关键字包围。它在 WINOLEAPI 宏上给我一个 "explicit type is missing" 错误。当我将宏的值显式替换为 "extern __declspec(dllimport) int __stdcall" 时,它会给我类似 "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__时(编译代码时没有定义,只有在intellisense检查文件时才定义。),它会从WINOLEAPI宏中删除无法识别的关键字。

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

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

在objbaseapi.h

上方添加#include <windows.h>

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