MingW头文件没有标签

时间:2018-12-29 11:27:05

标签: winapi visual-studio-code mingw header-files

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

Intellisense VSCode

应该是

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

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

1 个答案:

答案 0 :(得分:1)

  

应该是

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

事实并非如此。

工具提示将向您显示该函数的声明,如声明的那样 在MingGW的标题winuser.h中。该声明指定了函数的 prototype ,由以下组成:

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

如工具提示所示:

int MessageBoxW (HWND, LPCSTR, LPCSTR, UINT)

您所说的“标签”是参数名称。它们是可选的,并且是多余的, 在函数声明中,因为编译器不需要它们理解 声明的函数将如何被调用以及它返回什么。 MessageBoxWHWNDLPCSTR,另一个LPCSTR的参数调用, 和UINT,按此顺序;然后返回和int

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

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;
}

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

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

另请参阅Function Declaration in C

在函数声明中,

参数名称对人类读者来说是有用的 随附功能的文档,因为文档 然后可以引用参数名称来解释函数的行为:

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

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

类似于MinGW Windows标头,Micorosoft自己的标头不包含注释 来记录API,但它们 do 包含参数名称,还包含SAL Annotations 参数名称。例如。在Microsoft 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;因此保留参数名称 函数声明中多余的。