Вопрос
Я пытаюсь компилировать небольшой проект, который включает в себя Windows.h с помощью Clang Compiler. К сожалению, Clang производит некоторые ошибки, которые я не могу решить. Что вызывает эти ошибки? Зацепит ли Clang не поддерживает все необходимые функции, я что-то упускаю?
In file included from C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include/wind
ows.h:155:
In file included from C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include/wind
ef.h:177:
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include/winnt.h(12857) : warning:
expression result unused [-Wunused-value]
UNREFERENCED_PARAMETER(CallbackEnviron);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include/winnt.h:12857:28: note: in
stantiated from:
UNREFERENCED_PARAMETER(CallbackEnviron);
^~~~~~~~~~~~~~~
In file included from C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include/wind
ows.h:156:
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include/winbase.h(2326) : error:
invalid operands to binary expression ('LONGLONG' (aka 'double') and
'LONGLONG')
Old & Value,
~~~ ^ ~~~~~
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include/winbase.h(2327) : error:
expected ')'
Old) != Old);
^
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include/winbase.h(2325) : note:
to match this '('
} while (InterlockedCompareExchange64(Destination,
^
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include/winbase.h(2344) : error:
invalid operands to binary expression ('LONGLONG' (aka 'double') and
'LONGLONG')
Old | Value,
~~~ ^ ~~~~~
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include/winbase.h(2345) : error:
expected ')'
Old) != Old);
^
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include/winbase.h(2343) : note:
to match this '('
} while (InterlockedCompareExchange64(Destination,
^
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include/winbase.h(2362) : error:
invalid operands to binary expression ('LONGLONG' (aka 'double') and
'LONGLONG')
Old ^ Value,
~~~ ^ ~~~~~
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include/winbase.h(2363) : error:
expected ')'
Old) != Old);
^
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include/winbase.h(2361) : note:
to match this '('
} while (InterlockedCompareExchange64(Destination,
^
...and a lot more...
Решение
Возможно, вам необходимо определить Clang совместимую версию макроса unreference_Parameter. Что-то вроде этого должно помочь вам в пути: https://web.archive.org/web/20130425151054/http://sourcefrog.net/weblog/software/languages/c/unused.html.
Кроме того, кажется, что Type Longlong определяется как двойной для Clang, и вы не можете делать двоичные арифметические (и, или, а не и т. Д.). Вам необходимо убедиться, что это типируется как правильный целочисленный тип.
В зависимости от того, как Windows.h, winbase.h и winnt.h структурирован, вы можете сделать свою собственную обертку, которая получила правильное определение, чтобы сделать этот проход. В противном случае попытайтесь найти совместимую GCC версию Windows.h и используйте это. Clang должен быть совместимым с этим.
Удачи!