[英]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"
。
因此,我试图查看头文件本身,然后发现问题是,Intellisense识别出文件中的某些错误并且不允许我使用该函数,因为它认为该函数未正确声明。 HRESULT
没问题,因为它只是一些简单的typedef
,它可以理解。 但是, CoCreateInstance()
声明为:
WINOLEAPI CoCreateInstance( //...
WINOLEAPI
是包含WINOLEAPI
内容的宏:
extern __declspec(dllimport) int __stdcall
我假设__declspec
和__stdcall
是一些Windows特定的关键字,并且intellisense根本无法识别那些关键字,从而检测到错误,从而使函数未声明,因此出现"identifier is undefined"
错误。
这是问题的原因吗? 如果是这样,有什么办法可以“教”有关这些Windows特定关键字的智能感知吗? 毕竟这是Microsoft的扩展,我不知道为什么它不能识别Microsoft的C语言扩展。
我找到了一个临时修复程序。 请参阅下面的答案。
似乎combaseapi.h
和objbase.h
包含了它们所需的所有依赖项,因为即使intellisense也能够将__declspec
(和__stdcall
)识别为某些"int __declspec"
但无法理解语法,其中类型是被其他关键字包围。 它使我在WINOLEAPI
宏上出现“缺少显式类型”错误。 当我用宏的值明确替换为"extern __declspec(dllimport) int __stdcall"
替换宏时,它给了我类似"missing ;"
错误"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__
时(在编译代码时未定义,而仅在智能检查文件时才定义。),它从WINOLEAPI
宏中删除了无法识别的关键字。
最好在我的代码中应用一些类似的修复方法,而不用修改包含的标头。 同样,这仅解决了这种特殊情况,任何其他不受支持的关键字都必须单独处理。 就我而言,它解决了这两个头文件中的所有问题。
它可以工作,但是如果有人提供更好的解决方案,我仍然感激不尽。
在objbaseapi.h上方添加#include <windows.h>
windows.h包含必需的定义,例如HRESULT
(实际上来自winerror.h,但包括windows.h应该照顾它的依赖项等)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.