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

时间:2018-07-20 14:30:22

标签: c++ c windows visual-studio-code intellisense

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

#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"错误

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

更新

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

更新:澄清

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

2 个答案:

答案 0 :(得分:2)

我找到了一个临时解决方法。 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宏中删除无法识别的关键字。

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

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

答案 1 :(得分:2)

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

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