Domanda

Sto cercando di compilare un piccolo progetto che include windows.h usando il compilatore clang. Purtroppo, clang produce alcuni errori io non sono in grado di risolvere. Che cosa sta causando questi errori? Non clang non supporta tutte le caratteristiche richieste, mi sto perdendo qualcosa?

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...
È stato utile?

Soluzione

È probabilmente bisogno di definire una versione compatibile con clangore della macro UNREFERENCED_PARAMETER. Qualcosa del genere dovrebbe aiutare sulla strada: https://web.archive.org/web/20130425151054/http://sourcefrog.net/weblog/software/languages/C/unused.html

Inoltre, sembra il tipo LONGLONG è definito come il doppio per clang, e non è possibile fare l'aritmetica binaria (e, o non, ecc) su carri. È necessario assicurarsi che questo sia typedefed come una vera e propria tipo intero.

A seconda un po 'di come windows.h, winbase.h e winnt.h è strutturata si può essere in grado di fare il proprio involucro che ottiene i giusti definisce in atto per fare questo passo. In caso contrario, cercare di trovare una versione gcc-compatibile windows.h, e usare quella. Clang dovrebbe essere compatibile con esso.

In bocca al lupo!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top