首页 > 解决方案 > MingW 头文件没有标签

问题描述

我已经安装了 Microsoft 的 vscode 扩展程序 (ms-vscode.cpptools) 以启用智能感知。但是,当我输入MessageBox时,参数没有标签。

智能感知 VSCode

它应该是

MessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)

我的问题:为什么 MingW 分发没有标签的头文件?

标签: winapivisual-studio-codemingwheader-files

解决方案


它应该是

MessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)

事实并非如此。

工具提示向您显示函数的声明,如 MingGW 的 header 中声明的那样winuser.h。该声明指定了函数的 原型,包括:

  • 函数的返回类型,然后
  • 函数名,然后
  • 参数列表中参数的类型,在括号内,顺序正确。

正如工具提示所做的那样:

int MessageBoxW (HWND, LPCSTR, LPCSTR, UINT)

您所说的“标签”是参数名称。它们在函数声明中是可选的,并且是多余的,因为编译器不需要它们来理解声明的函数将如何被调用,以及它返回什么。将按顺序使用 a 、 a 、 another和 aMessageBoxW 的参数调用;它返回和。HWNDLPCSTRLPCSTRUINTint

编译器要求在函数定义中命名参数:

添加.c

// definition

int add(int x, int y)
{
    return x + y;
}

主程序

#include <stdio.h>

extern int add(int,int); // Declaration

int main()
{
    printf("%d\n",add(3,4));
    return 0;
}

以最大的严格性编译,链接并运行:

$ gcc -Wall -Wextra -pedantic -o prog main.c add.c
$ ./prog
7

另请参见C 中的函数声明

当声明伴随着函数的文档时,参数名称对函数声明中的人类读者很有用,因为文档可以参考参数名称来解释函数的行为:

/*
    Return the sum of `x` and `y`
*/
int add(int x, int y);

但它们对编译器来说是不必要的。

与 MinGW 窗口标题一样,Micorosoft 自己的标题不包含记录 API 的注释,但它们包含参数名称,以及参数名称的SAL 注释 。例如在微软WinUser.h(SDK 2017)的声明MessageBoxW是:

int
WINAPI
MessageBoxW(
    _In_opt_ HWND hWnd,
    _In_opt_ LPCWSTR lpText,
    _In_opt_ LPCWSTR lpCaption,
    _In_ UINT uType);

SAL 注释 (_In_opt__In_类似注释) 是一种非标准 Microsoft 语言扩展,支持对实现或调用 API 的代码的正确性进行静态分析,Microsoft 的编译器将它们用于此目的。

这种基于 SAL 的静态分析需要注释参数的名称,以便提供有意义的诊断;因此,参数在 Microsoft 标头中的注释声明中具有名称。

GCC,包括 MinGW 端口,不支持 SAL;所以参数名称在函数声明中仍然是多余的。


推荐阅读