我正在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.h
和objbase.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
宏中删除无法识别的关键字。
不过,最好在我的代码中应用一些类似的修复程序,而不是修改包含的头。此外,这只修复了这种特殊情况,任何其他不受支持的关键字都必须单独处理。在我的例子中,它修复了这两个头文件中的所有问题。
它是有效的,但如果有人能提供更好的解决方案,我将不胜感激。