Windows.h и clang (LLVM) - PullRequest
       11

Windows.h и clang (LLVM)

5 голосов
/ 04 августа 2010

Я пытаюсь скомпилировать небольшой проект, включающий windows.h, используя компилятор clang. К сожалению, 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...

1 Ответ

3 голосов
/ 04 августа 2010

Возможно, вам нужно определить clang-совместимую версию макроса UNREFERENCED_PARAMETER. Что-то вроде этого должно помочь вам в пути: https://web.archive.org/web/20130425151054/http://sourcefrog.net/weblog/software/languages/C/unused.html

Кроме того, кажется, что тип LONGLONG для clang определен как double, и вы не можете выполнять двоичную арифметику (и / или, и т. Д.) Для чисел с плавающей точкой. Вы должны убедиться, что он определен как правильный целочисленный тип.

В зависимости от того, как структурированы windows.h, winbase.h и winnt.h, вы можете сделать свою собственную обертку, которая получает правильные определения для этого прохода. В противном случае попробуйте найти gcc-совместимую версию windows.h и используйте ее. Clang должен быть совместим с ним.

Удачи!

...