MingW头文件没有标签

RizonBarns

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

Intellisense VSCode

它应该是

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)

您所谓的“标签”是参数名称。它们在函数声明中是可选的,并且是多余的,因为编译器不需要它们来了解将如何调用已声明的函数以及返回的内容。MessageBoxW将使用依次为a HWND,a LPCSTR,anotherLPCSTR和a的参数来调用UINT它返回和int

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

添加

// 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

另请参见C中的函数声明

参数声明在函数声明中附有函数文档时,对人类读者很有用,因为文档随后可以引用参数名来解释函数的行为:

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

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

像MinGW Windows标头一样,Micorosoft自己的标头不包含用于记录API的注释,但它们确实包含参数名称以及参数名称的SAL注释例如,在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,它们被用于这一目的通过微软的编译器是正确的静态分析。

这种基于SAL的静态分析需要带注释的参数名称,以便提供有意义的诊断。因此,参数在Microsoft标头的带注释的声明中具有名称。

GCC,包括MinGW端口,不支持SAL;因此参数名称在函数声明中仍然是多余的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

头文件没有被读取?

文件运行而没有头文件

没有头文件的C / C ++程序

gcc没有选择内核头文件

包含没有“.h”格式的头文件

Ajax没有设置头文件-与TS反应

Xcode在头文件(包括自身)上没有警告

没有在Xcode中添加UITests桥接头文件

没有extern的头文件中的全局变量

项目中可用的本地头文件,但make没有给出此类文件或目录错误

Cmake链接共享库:当包含库中的头文件时,“没有这样的文件或目录”

为什么修改了源文件和头文件,但是没有重新编译makefile

如果我没有在头文件中声明所有函数,会发生什么?

cmake 可以包含一个有头文件和 lib 文件但没有 .cmake 文件的库吗?

无法打开源文件“所有 cpp 头文件”并且全局范围没有“某些文件名”错误

在没有默认构造函数的情况下实例化头文件中声明的变量

C 包装 C++ 库,没有不必要的头文件

为什么头文件没有在其他编程语言中流行起来?

从头文件<string>,<stack>编译没有给出任何输出

为什么在头文件中定义`const int`时没有重复的定义错误?

Elixir-为什么这些重复的头文件没有编译器警告?

Swift没有选项在Build Options下添加Ob-C桥接头文件

VisualStudio 2010-没有更多的自动预编译头文件吗?

没有头文件如何使用C++调用其他模块中的函数?

没有识别从头文件调用到主 C++ 的方法?

我们可以仅具有内联全局函数的头文件,这意味着没有.cpp文件吗?

有没有一种简单的方法可以分析头文件并获得所有#define的结果列表?

有没有办法将 MinGW .a 文件转换为 msvc lib/dll?

无法打开包含文件'afxwin.h':vs 2013 C ++中没有此类头文件或目录