Ошибки компиляции при использовании C++ и заголовка bcrypt

Я пытаюсь протестировать Windows Bcrypt. У меня есть тестовая программа:

#include <bcrypt.h>
#include <iostream>
#include <string>

#pragma comment (lib, "bcrypt.lib")

int main(int argc, char* argv[])
{
    return 0;
}

Попытка скомпилировать:

>cl.exe /DWINVER=0x0600 /TP /GR /EHsc bcrypt-test.cpp /link /out:bcrypt-test.exe
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.24210 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

bcrypt-test.cpp
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared\bcrypt.h(39):
 error C2059: syntax error: 'return'
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared\bcrypt.h(40):
 error C2143: syntax error: missing ';' before '*'
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared\bcrypt.h(40):
 error C4430: missing type specifier - int assumed. Note: C++ does not support d
efault-int
...
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared\bcrypt.h(681)
: error C3646: 'cbKeyLength': unknown override specifier
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\shared\bcrypt.h(681)
: fatal error C1003: error count exceeds 100; stopping compilation

Я использую командную строку Инструменты сборки Visual C++ x64. Насколько я понимаю, Bcrypt должен быть нацелен на Vista или выше. WINVER=0x0600 должно удовлетворять требованию. Я нашел аналогичный вопрос на форумах MSDN по адресу ошибка сборки bcrypt.h?, и в нем говорится об использовании современного SDK. Я считаю, что Windows Kit SDK должен удовлетворять этому требованию.

Почему возникают ошибки компиляции и как их исправить?


Строка 39 в bcrypt.h является первым определением типа ниже. Преамбула, как и защита авторских прав и заголовка, была пропущена для краткости.

#ifndef WINAPI
#define WINAPI __stdcall
#endif

#ifndef _NTDEF_
typedef _Return_type_success_(return >= 0) LONG NTSTATUS;
typedef NTSTATUS *PNTSTATUS;
#endif

#ifndef BCRYPT_SUCCESS
#define BCRYPT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
#endif

person jww    schedule 13.08.2019    source источник
comment
Если в Visual Studio нет какого-то очень странного языкового расширения (что, к сожалению, не является чем-то необычным), строка typedef _Return_type_success_... недействительна.   -  person Some programmer dude    schedule 13.08.2019
comment
Эта ошибка выглядит как повторение Как компилировать WinCrypt.h под Visual C++?. Я бы отметил это как дубликат, за исключением того, что это другой заголовок. Почему Microsoft оставляет эти ошибки гноиться на десятилетие?   -  person jww    schedule 17.09.2019


Ответы (1)


Вам не хватает включения.

#include <Windows.h> // <- Added this
#include <bcrypt.h>
#include <iostream>
#include <string>

#pragma comment (lib, "bcrypt.lib")

int main()
{
    return 0;
}
person Frodyne    schedule 13.08.2019
comment
Спасибо. Как гении в Microsoft забыли включить свой собственный заголовок окна??? Как это прошло QA??? Microsoft становится таким же плохим, как Apple с их качеством. - person jww; 13.08.2019