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.h
和 objbase.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 应该照顾它的家属等)
我正在试验 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.h
和 objbase.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 应该照顾它的家属等)