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