2010-03-18 8 views
9

Tengo un pequeño archivo de encabezado propio que declara un par de funciones, una de las cuales tiene un tipo de devolución de DWORD. Soy reacio a arrastrar en windows.h solo para obtener la definición oficial de este tipo, ya que ese archivo es enorme, y mi encabezado se utilizará en una serie de módulos fuente que de otra manera no lo necesitan.¿Cuál es el encabezado de Windows más pequeño que puedo #incluir para definir DWORD?

Por supuesto, en la práctica sé que DWORD es solo , pero prefiero el enfoque más higiénico de incluir un archivo de encabezado oficial si es posible.

En this page dice que DWORD se define en windef.h, incluyendo pero desafortunadamente solo este pequeño archivo conduce directamente a errores de compilación - al parecer, que espera ser incluido por otras cabeceras. (Además, el hecho de que mi archivo sea un archivo de encabezado también significa que no puedo declarar WIN32_LEAN_AND_MEAN, ya que el archivo de origen que #include mi archivo podría necesitar que no esté definido).

¿Alguna idea? Sé que no es el fin del mundo, puedo continuar al #include <windows.h>, pero pensé que alguien podría tener una mejor idea.

[EDIT] Gracias por su respuesta. Para aquellos que sugirieron usar un tipo diferente, permítanme explicar por qué no es deseable en este caso: he configurado diferentes versiones específicas de la plataforma de las dos funciones en diferentes archivos fuente, y solicito a la configuración de CMake que detecte la plataforma actual y elige cuál construir. En Windows, mis funciones se ven como:

typedef DWORD TimePoint; 
TimePoint GetTimeNow(void); 
double TimeDifference(TimePoint start, TimePoint end); 

La versión de Windows de GetTimeNow() sólo llama a la API de Windows timeGetTime(), que tiene tipo DWORD volver, y por lo tanto deben tener el mismo tipo de retorno. (En otras plataformas, TimePoint tendrá un tipo diferente, por ejemplo struct timeval en plataformas UNIXy). En efecto, los valores de tipo TimePoint son opacos, y lo único que puede hacer con ellos es pasar dos de ellos al TimeDifference() para medir el tiempo transcurrido entre ellos en segundos. Esto permite el desarrollo multiplataforma. Desafortunadamente, todavía significa que el código del cliente debe conocer el tipo concreto de TimePoint.

+2

¿Por qué no utilizar C standard lib, que está disponible en Windows (ver http://msdn.microsoft.com/en-us/library/abx4dbyh%28VS.80%29.aspx y http: // msdn. microsoft.com/en-us/library/w4ddyt9h%28VS.80%29.aspx); si todo lo que necesitas es una resolución de 1 segundo, ya hay una versión multiplataforma de 'TimeDifference()' llamada 'difftime()' – Christoph

+0

Gracias Cristoph, de hecho eso es exactamente lo que tenía, pero esto es para perfilar y tenemos varios conjuntos de datos que abarcan el rango 1-10, así que decidí que quería un poco más de resolución. –

Respuesta

4

Incluya Windows.h y use encabezados precompilados. ¡Por cierto, puedes definir WIN32_LEAN_AND_MEAN y luego definirlo más tarde!

+0

Los encabezados precompilados son una buena idea, pero me preocupa que si se incluye windows.h con WIN32_LEAN_AND_MEAN definido antes, incluyéndolo sin, podría causar que el último #include se ignore debido a #incluye guardias. –

2

Yo diría que solo defínala tú mismo. De esta forma, es más independiente de la plataforma (por supuesto, no sé si el resto del código requiere Windows). Si no quiere hacer eso, use encabezados precompilados.

+0

Encabezados precompilados es una buena idea, pero en este caso no es más independiente de la plataforma para definirlo yo mismo. Consulte mis ediciones en la pregunta original. ¡Gracias! –

1

¿Por qué no define en su lugar la función para devolver int? Este es un tipo muy portátil y divorcia completamente su código de el malvado imperio Microsoft.

+0

¿Cómo se puede reemplazar "el imperio del mal" con "Microsoft" de alguna manera al SO? – Tom

+0

He aclarado mi pregunta para explicar por qué en este caso, necesito devolver la idea de Windows de un 'DWORD'. Gracias de todos modos :) –

1

No utilice un DWORD. He visto demasiados códigos de Windows que se han transferido a otras plataformas más adelante. Esas DWORD se convierten en un problema real cuando todos tienen su propia definición. No creo que haya ninguna buena razón para usar tipos específicos de Windows en las interfaces.

Incluso si su código nunca se trasladará a ninguna otra plataforma, sigo creyendo que el código debe usar los tipos nativos o sus propios tipos (por ejemplo, MyInt32, MyUInt64, etc.), pero nada de windows.h.

+0

He aclarado mi pregunta para explicar por qué en este caso, necesito devolver la idea de Windows de un 'DWORD'. Gracias de todos modos :) –

2

Creo que solía incluir winbase.h, pero parece que ya no es así.Todas las fuentes que he visto recomiendan windows.h, con la opción de WIN32_LEAN_AND_MEAN. Como ha indicado, la última optimización no lo ayuda.

Podría hacer algo como esto.

#ifndef _WINDEF_ 
typedef unsigned long DWORD; 
#endif 

No limpio, pero eficiente. No es probable que este typedef cambie alguna vez.

+0

winbase.h fue una buena idea, gracias por intentarlo. –

1

Un DWORD siempre va a ser un entero sin signo de 32 bits, por lo que en realidad no importa si se utiliza o DWORDunsigned long o uint32_t. Si los tres tipos se refieren a un int sin signo de 32 bits, el compilador los considerará equivalentes.

Dado que esto forma parte de los archivos específicos de la plataforma, no creo que deba preocuparse tanto por la portabilidad. Diablos, hurgue en los encabezados para encontrar el tipo nativo de DWORD y simplemente ponga ese typedef en su encabezado. Los compiladores C aceptan typedefs duplicados siempre que tengan el mismo tipo subyacente.

+0

En realidad, no es una mala idea: Windows está obligado a cambiar el tipo de 'DWORD' por razones de compatibilidad, así que podría desenterrar ese tipo y usarlo directamente. –

+0

¿No es portátil uint32_t hablar por entidad de 32 bits sin firmar? Ack, llámame thread necro ... ¿Por qué apareció esto como una nueva questuin? :( – JimR

1

Si le preocupa que cuando su programa multiplataforma se ejecute en Windows cargará demasiadas DLL de Windows solo porque su código fuente tenía #include < windows.h>, creo que se está preocupando demasiado. Incluso el Bloc de notas tiene que cargar la mitad del universo conocido, y se sabe que se carga y ejecuta en ocasiones.

Si le preocupa que cuando otros desarrolladores usen Windows, su archivo .h multiplataforma pondrá un montón de contaminación en el espacio de nombres en sus entornos de compilación, creo que se está preocupando demasiado. El 99.999% de los proyectos de Windows ya hicieron un #include < windows.h> antes de que llegaran a su archivo .h.

+1

No se cargarán archivos DLL porque incluyo un archivo de cabecera, así que no es eso lo que me preocupa. Solo quería un encabezado más liviano para reducir el tiempo de compilación si fuera posible. Intentaré activar los encabezados precompilados, es de esperar que no haya interacciones negativas con el sistema de compilación de CMake. –

1

¿Hay un <wtypes.h> donde se encuentra? Porque en ella, veo:

#ifndef _DWORD_DEFINED 
#define _DWORD_DEFINED 
typedef unsigned long DWORD; 

#endif // !_DWORD_DEFINED 

Este archivo se encuentra bajo "... \ VC98 \ INCLUDE" aquí .. que es para VC6 así que me imaginé que será en versiones posteriores.

Estaba buscando lo mismo que el OP y lo resolví incluyendo dicho encabezado.

+0

¡Interesante! Ese 'typedef' en particular parece estar envuelto en un' #ifdef! defined (_WIN32) &&! defined (_MPPC_) ', que se comenta como" El siguiente código es solo para Win16. "Así que estoy sorprendido de que funcione para usted ...? –

+0

Hmm .. Las pruebas rápidas mostraron que' _WIN32' está realmente definido, pero '_MPPC_' no es ... No pude encuentre cualquier información útil sobre esta macro así que no tengo idea de lo que es ... La portabilidad puede ser un problema y mmm, pero funciona a pesar de ese comentario. También noté que la línea que sigue ese comentario es otro nivel de ajuste que va '# ifndef WINAPI' con el comentario _Si no está incluido en 3.1 encabezados ..._, pero 'WINAPI' no está definido aquí a menos que esté incluido. – antak

1

Use this file: include <IntSafe.h>

0

¿Qué tal - #include <minwindef.h>?

+0

¿Has probado esto? (Es decir, compiló con éxito un programa corto que '# include's this and contains, por ejemplo,' sizeof (DWORD) '.) Google lo sugiere como una macro' # define'sa 'max', que es molesto pero no es un dealbreaker si se puede apagar! –

Cuestiones relacionadas