Я пытаюсь получить проект моей сборки на Windows, что для меня впервые. Я новичок в платформе. Я использую clang-cl для поддержки C11. Источник изначально использовал noreturn
из <stdnoreturn.h>
для аннотации функции, которая никогда не вернется. В итоге я получил целую кучу ошибок declspec при компиляции и сузил их до настолько тривиального файла, насколько мог.
#include <stdnoreturn.h>
#include <stdlib.h>
Либо сами по себе сборки хороши, но вместе они выдают длинный список ошибок, все точно такой же тип:
__declspec attributes must be an identifier or string literal
все они недовольны вариациями одного и того же расширения макросов:
[build] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\vcruntime.h(326,20): error: __declspec attributes must be an identifier or string literal
[build] __declspec(noreturn) void __cdecl __report_gsfailure(_In_ uintptr_t _StackCookie);
[build] ^
[build] C:\PROGRA~1\LLVM\lib\clang\8.0.1\include\stdnoreturn.h(27,18): note: expanded from macro 'noreturn'
[build] #define noreturn _Noreturn
Я пытался передать -fms-extensions и -fms-compatibility в clang-cl и не получил ни одной кости. Насколько я понимаю, clang расстроен тем, что Windows помещает ключевое слово в эту спецификацию declspec? Я мало что знаю о каких-либо расширениях MS.
Использование простого старого _Noreturn
отлично работает, поэтому я могу компилировать свой код. Но есть ли у кого-нибудь больше информации о том, что здесь происходит и как исправить? Является ли объединение msvc и clang просто дерьмовым по своей сути или я делаю что-то не так?
РЕДАКТИРОВАТЬ: я идиот.
Проблема в том, что расширение макроса нарушает _declspec(noreturn)
внутри заголовков Windows SDK. Решение очевидно:
#include <stdlib.h>
#include <stdnoreturn.h>
Который отлично строится, потому что макрос определяется после заголовка Windows SDK, который использует declspec(noreturn)
noreturn
может быть расширено до_Noreturn
в__declspec
- person Antti Haapala   schedule 04.08.2019stdnoreturn
, если только вы не хотите изменить компилятор. FWIW msys2 clang и gcc не имеют проблемы - person M.M   schedule 05.08.2019<noreturn.h>
или<stdnoreturn.h>
- person user3629249   schedule 05.08.2019<stdnoreturn.h>
никогда не тестировался с Windows SDK, только с libc++, если вообще.__declspec
поддерживает несколько модификаторов. clang расстроен, потому что препроцессор расширяетnoreturn
до недопустимого модификатора. Я не знаю, как это можно исправить, MS не поддерживает C11, поэтому они могут использоватьnoreturn
в качестве ключевого слова. clang должен был бы выполнить некоторую магию для поддержки этого конкретного макроса. - person nickelpro   schedule 06.08.2019