Заголовочные файлы MingW не имеют меток - PullRequest
0 голосов
/ 29 декабря 2018

Я установил расширение vscode (ms-vscode.cpptools) от Microsoft, чтобы включить intellisense.Но когда я набрал MessageBox , параметры не имеют меток.

Intellisense VSCode

Это должно быть

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

Мой вопрос: Почему MingW распространяет файлы заголовков без меток?

1 Ответ

0 голосов
/ 31 декабря 2018

Это должно быть

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

Это не так.

Подсказка показывает объявление функции, как объявлено в заголовке MingGW winuser.h.Это объявление определяет прототип функции , состоящий из:

  • Тип возврата функции, затем
  • Имя функции, затем
  • Типы параметров в списке параметров в квадратных скобках в правильном порядке.

в качестве подсказки:

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

См. Также Объявление функций вC

Имена параметров полезны для читателей-людей в объявлении функции, когда объявление сопровождается документацией функции, поскольку документация может затем ссылаться на параметр-имена, объясняющие поведение функции:

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

Но они не нужны компилятору.

Как и заголовки окон MinGW, собственные заголовки 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;поэтому имена параметров остаются избыточными в объявлениях функций.

...