【问题标题】:VSCode C/C++ Intellisense and Windows specific librariesVSCode C/C++ Intellisense 和 Windows 特定库
【发布时间】:2018-12-28 21:36:30
【问题描述】:

我正在尝试使用 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 特定关键字的信息?毕竟它是微软的扩展,我不知道为什么它不能识别微软的 C 语言扩展。

更新

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

更新:澄清

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

【问题讨论】:

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


    【解决方案1】:

    在objbaseapi.h上方添加#include &lt;windows.h&gt;

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

    【讨论】:

    • 感谢您的建议,但它似乎不起作用。我编辑了我的问题,澄清了头文件中的错误。这可能不是缺少依赖标头的问题。
    【解决方案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宏中删除无法识别的关键字。

    在我的代码中应用一些类似的修复而不是修改包含的标头会很好。此外,这只修复了这种特殊情况,任何其他不受支持的关键字都必须单独处理。就我而言,它修复了这两个头文件中的所有问题。

    它有效,但如果有人提供更好的解决方案,我仍然会很感激。

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2022-09-27
      相关资源
      最近更新 更多