MingW 头文件没有标签

MingW Header Files Have No Labels

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

应该是

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

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

It should be

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

事实并非如此。

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

  • 函数的return类型,则
  • 函数名,然后
  • parameter-list括号内的参数类型,顺序正确。

如工具提示所示:

int MessageBoxW (HWND, LPCSTR, LPCSTR, UINT)

你所说的"labels"是parameter-names。它们是可选的,而且是多余的, 在函数声明中,因为编译器不需要它们来理解 如何调用声明的函数,以及它 return 的内容。 MessageBoxW 将使用 HWNDLPCSTR、另一个 LPCSTR 等参数调用 和 UINT,按此顺序;它 returns 和 int.

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

add.c

// definition

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

main.c

#include <stdio.h>

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

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

以最大严格性编译,link 和 运行:

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

另见 Function Declaration in C

Parameter-names 在 function-declaration 声明时对人类读者 有用 伴随着函数的文档,因为文档 然后可以参考 parameter-names 来解释函数的行为:

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

但是编译器不需要它们。

与 MinGW windows headers 一样,Micorosoft 自己的 headers 不包含注释 记录 API,但它们 do 包含 parameter-names,并且还 SAL Annotations 的参数名称。例如。在微软的 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_ 和类似的)是 non-standard Microsoft 支持代码正确性静态分析的语言扩展 实施或调用 API,Microsoft 将它们用于该目的 编译器。

这样的SAL-based静态分析需要names注解参数才能提供 有意义的诊断;因此参数在注释声明中有名称 在微软的 headers.

GCC,包括 MinGW 端口,不支持 SAL;所以参数名称保留 函数声明多余。