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
将使用 HWND
、LPCSTR
、另一个 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
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;所以参数名称保留
函数声明多余。
我已经安装了 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
将使用 HWND
、LPCSTR
、另一个 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
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;所以参数名称保留 函数声明多余。