我已经从Microsoft安装了vscode扩展(ms-vscode.cpptools)以启用智能感知。但是,当我键入 MessageBox 时,参数没有标签。
应该是
MessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
我的问题:为什么MingW分发没有标签的头文件?
答案 0 :(得分:1)
应该是
MessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
事实并非如此。
工具提示将向您显示该函数的声明,如声明的那样
在MingGW的标题winuser.h
中。该声明指定了函数的
prototype ,由以下组成:
如工具提示所示:
int MessageBoxW (HWND, LPCSTR, LPCSTR, UINT)
您所说的“标签”是参数名称。它们是可选的,并且是多余的,
在函数声明中,因为编译器不需要它们理解
声明的函数将如何被调用以及它返回什么。 MessageBoxW
用HWND
,LPCSTR
,另一个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
在函数声明中,参数名称对人类读者来说是有用的 随附功能的文档,因为文档 然后可以引用参数名称来解释函数的行为:
/*
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;因此保留参数名称 函数声明中多余的。