winapi - MingW 头文件没有标签
问题描述
我已经安装了 Microsoft 的 vscode 扩展程序 (ms-vscode.cpptools) 以启用智能感知。但是,当我输入MessageBox时,参数没有标签。
它应该是
MessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
我的问题:为什么 MingW 分发没有标签的头文件?
解决方案
它应该是
MessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
事实并非如此。
工具提示向您显示函数的声明,如 MingGW 的 header 中声明的那样winuser.h
。该声明指定了函数的
原型,包括:
- 函数的返回类型,然后
- 函数名,然后
- 参数列表中参数的类型,在括号内,顺序正确。
正如工具提示所做的那样:
int MessageBoxW (HWND, LPCSTR, LPCSTR, UINT)
您所说的“标签”是参数名称。它们在函数声明中是可选的,并且是多余的,因为编译器不需要它们来理解声明的函数将如何被调用,以及它返回什么。将按顺序使用 a 、 a 、 another和 aMessageBoxW
的参数调用;它返回和。HWND
LPCSTR
LPCSTR
UINT
int
编译器要求在函数定义中命名参数:
添加.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;所以参数名称在函数声明中仍然是多余的。
推荐阅读
- reactjs - material-ui,useState 在打字稿中给出类型错误
- python - 如何将初始 request.user 设置为初始模型表单数据?
- python - 如何计算小波能量与香农熵比以在python中选择最佳母离散小波?
- node.js - 将 node.js 本身作为开发依赖项放在基于 JavaScript 的项目中
- c++ - 为什么我的代码不能正确地将字符串转换为 int 数组?
- chef-infra - 无法接受线
- c# - 过滤具有不同值和列表大小的列表的可靠方法
- c - Fortify 报告缓冲区溢出和整数溢出
- javascript - 如何在 a 上使用 OnClick 事件来更改 DIV 的可见性
- javascript - 根据另一个数组的奇偶索引元素创建数组