2012-03-29 15 views
9

Recientemente obtuve el código fuente en una aplicación. Cuando intento construir la solución, aparece un error en todas las partes donde se incluye winnt.h. Los códigos de error difiere un poco, pero siempre apuntan a estas líneas en winnt.h:error de sintaxis: falta ';' antes del identificador 'PVOID64' al compilar winnt.h

typedef void *PVOID; 
typedef void * POINTER_64 PVOID64; 

y

struct { 
    DWORD crc; 
    BYTE rgbReserved[14]; 
} CRC; 

Por lo tanto, lo que podría ser la causa de esto? winnt.h es un encabezado estándar y no ha sido modificado. ¿Tiene algo que ver conmigo usando VS 2010, o yo usando Windows de 64 bits? o es algún tipo de configuración que se necesita?

EDIT: aquí está el error códigos exactos:

1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(290): error C2146: syntax error : missing ';' before identifier 'PVOID64' 
1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(290): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(8992): error C2146: syntax error : missing ';' before identifier 'Buffer' 
1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(8992): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(8992): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(11525): error C2059: syntax error : 'constant' 
1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(11525): error C2238: unexpected token(s) preceding ';' 
1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(11556): error C2059: syntax error : 'constant' 
1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(11556): error C2238: unexpected token(s) preceding ';' 
+0

Por favor, publique el error (s) exacto (s) – Konrad

+0

Parece que está tratando de escribir dos nombres a la vez? Estoy bastante seguro de que eso no es estándar. – BoBTFish

+0

Agregó los códigos de error –

Respuesta

10

Es necesario incluir windows.h en lugar de winnt.h. Cuando incluya windows.h, a su vez, incluirá winnt.h. Debe hacerlo de esta manera para que las macros necesarias estén en su lugar y sean necesarias para compilar winnt.h.

En este caso, POINTER_64 se define en BaseTsd.h así:

#define POINTER_64 __ptr64 

Pero si se incluye winnt.h antes de incluir windows.h continuación POINTER_64 no está definido.

2

Parece que su configuración de Windows SDK no es válida. Este error es causado por el hecho de que el compilador no puede reconocer la instrucción 'POINTER_64'. Puede solucionar este problema reemplazando 'POINTER_64' con '__ptr64'.

Tuve el mismo problema recientemente. Luego reinstalé la última versión del SDK de Windows y esto solucionó el problema.

ACTUALIZACIÓN @ David Heffernan, correctamente señala el hecho de que se debe incluir en lugar de windows.h winnt.h

+0

Fantástico, tengo este error después de una conversión de un proyecto antiguo. ¡Tanto esto como la respuesta de Danil Serov resuelven mi problema! –

7

Si está utilizando DirectX SDK, pruebe a cambiar la Directorios de VC++ para incluir y lib que se debe buscar pasado.

+0

gracias, su respuesta parece abordar mi problema correctamente (compilando un proyecto que apunta/incluye DirectX 8.1 SDK) sin alguna recomendación extraña para eliminarlo (respuesta de Serov), o (presumiblemente) modificar partes de él (como parece ser la respuesta aceptada sugerir). –

+1

En realidad, tuve que hacer lo contrario (a menos que esté preparando una respuesta inadecuada) .. Tuve que colocar el SDK en las instancias del Directorio de ejecutables/bibliotecas después de las instancias estándar de Incluir/Ejecutable/Directorio de Bibliotecas: es decir, ** DirectorioDirectorio: ** '$ (ExecutablePath); C: \ DXSDK \ bin' –

+0

Me funcionó también. –

1

corrigen manualmente sintaxis en winnt.h:

typedef void * POINTER_64 PVOID64; => typedef void * POINTER_64, * PVOID64; 
+0

typedef void * POINTER_64; typedef void * PVOID64; –

+0

Puedes editar tu publicación si necesitas arreglar algo (tu comentario parece algo que debería ser una actualización). – lxg

0

Si está utilizando librdkafka, obtendrá este error cada vez que "Windows.h" incluido.

Lo arreglé cambiando el nombre "librdkafka/include/basetsd.h" a un nombre diferente, o accediendo al este encabezado de biblioteca a través de subruta!

Creo que el autor de esta biblioteca creó este archivo para tratar con la compatibilidad de la plataforma del sistema operativo. Pero con el mismo nombre de archivo "basetsd.h" como Windows Core, solo confunde a Visual Studio.

Cuestiones relacionadas