代码之家  ›  专栏  ›  技术社区  ›  egst

VSCODC/C++智能感知与Windows专用库

  •  1
  • egst  · 技术社区  · 7 年前

    我正在试用C++中的一些特定于Windows的库(使用C++代码中的C库)。我想包括 objbase.h 对于 CoCreateInstance() 功能:

    #include <objbase.h>
    // ...
    HRESULT hr = CoCreateInstance(/* ... */);
    

    我的问题是VSCode C/C++扩展的智能感知。代码编译正常,但IntelliSense识别此函数时遇到一些问题。它与 HRESULT ,但为了 共同创建状态() 它显示 "identifier is undefined" .

    所以我试图查看头文件本身,发现问题是,IntelliSense识别文件中的一些错误,不让我使用函数,因为它认为没有正确声明。这和 结果 因为这只是一些简单的 typedef ,它理解。然而, 共同创建状态() 声明为:

    WINOLEAPI CoCreateInstance( //...
    

    哪里 WINOLEAPI 是包含如下内容的宏:

    extern __declspec(dllimport) int __stdcall
    

    我想 __declspec __stdcall 是一些特定于Windows的关键字,而IntelliSense只是不识别这些关键字,检测到一个错误,从而使函数未声明,因此 “未定义标识符” 错误。

    这就是问题的原因吗?如果是这样,有没有什么方法可以“教”这些特定于Windows的关键字的智能感知?毕竟它是微软的扩展,我不知道为什么它不能识别微软的C语言扩展。

    更新

    我找到了一个临时的解决办法。请看下面我的答案。

    更新:澄清

    似乎两者都是 combaseapi.h 对象库H 包括他们需要的所有依赖项,因为即使是IntelliSense也能够识别 _解密 (和) _ stdcall )作为一些 "int __declspec" 但它无法理解语法,因为类型被其他关键字包围。它在 温诺莱普 宏。当我将宏的值显式替换为 "extern __declspec(dllimport) int __stdcall" 它给了我错误,比如 "missing ;" . 所以,它似乎不理解这种语法。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Wander3r    7 年前

    添加 #include <windows.h> 在objbaseapi.h上面

    windows.h包含必需的定义,如 HRESULT (实际上来自winerrror.h,但包括windows.h应该照顾它的家属等)

        2
  •  2
  •   egst    7 年前

    我找到了一个临时的解决办法。这个 WINOLEAPI 宏是在 combaseapi.h 文件。我把这些行添加到文件中 温诺莱普 定义:

    // 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检查文件时才定义),它从 温诺莱普 宏。

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

    这是可行的,但如果有人能提供更好的解决方案,我还是会感激的。