Was ist das kleinste Windows-header kann ich #include define DWORD?
Habe ich einen kleinen header-Datei von meiner eigenen, die erklärt, eine Reihe von Funktionen, von denen der eine hat einen Rückgabetyp DWORD
. Ich bin nur ungern ziehen in windows.h
nur, um die offizielle definition dieser Typ da, die Datei ist riesig, und mein Kopf wird in eine Anzahl von Quellcode-Modulen, die sonst nicht brauchen.
Natürlich, in der Praxis weiß ich, dass DWORD
ist nur unsigned int
, aber ich würde es vorziehen, die mehr hygienischen Ansatz, einschließlich einer offiziellen header-Datei, wenn möglich.
Auf auf dieser Seite es sagt, dass DWORD
definiert ist, in windef.h
, aber leider darunter nur diese kleine Datei, die führt direkt zu Kompilierungs-Fehler-anscheinend rechnet aufgenommen werden, durch die anderen Header. (Auch die Tatsache, dass meine Datei ist eine header-Datei auch heißt, ich kann nicht nur erklären, sondern WIN32_LEAN_AND_MEAN
, da die source-Datei #schließt die Datei vielleicht müssen dies müssen nicht definiert werden.)
Irgendwelche Ideen? Ich weiß, es ist nicht das Ende der Welt-kann ich nur weiter #include <windows.h>
- aber dachte, jemand habe eine bessere Idee!!
[BEARBEITEN]
Vielen Dank für Eure Antworten. Für diejenigen, die vorgeschlagen, mit einer anderen Art, lassen Sie mich erklären, warum das nicht wünschenswert, in diesem Fall: ich habe unterschiedliche, Plattform-spezifische Versionen der beiden Funktionen in unterschiedlichen source-Dateien, und stellen Sie die CMake-Konfiguration zur Erkennung der aktuellen Plattform und wählen, welche zu bauen. Auf Windows, meine Funktionen Aussehen:
typedef DWORD TimePoint;
TimePoint GetTimeNow(void);
double TimeDifference(TimePoint start, TimePoint end);
Die Windows-version von GetTimeNow()
nur Aufrufe der Windows-API timeGetTime()
, die zurückkehren, geben Sie DWORD
, und so muss es haben, den gleichen Rückgabetyp. (Auf anderen Plattformen TimePoint
haben eine andere Art, z.B. struct timeval
auf UNIXy Plattformen.) Im Effekt, die Werte vom Typ TimePoint
sind undurchsichtig, und die einzige Sache, die Sie tun können, mit Ihnen ist pass zwei von Ihnen zu TimeDifference()
Messen die verstrichene Zeit zwischen Ihnen in Sekunden. Dies ermöglicht cross-Plattform-Entwicklung. Leider ist es immer noch bedeutet, dass der client-code hat, um zu wissen, die konkrete Art der TimePoint
.
- Warum nicht verwenden Sie die C-standard-lib, die ist avaibale auf Windows (siehe msdn.microsoft.com/en-us/library/abx4dbyh%28VS.80%29.aspx und msdn.microsoft.com/en-us/library/w4ddyt9h%28VS.80%29.aspx ); wenn alles, was Sie brauchen, ist 1-Sekunden-Auflösung, gibt es schon eine cross-Plattform-version
TimeDifference()
genanntdifftime()
- Dank Cristoph, in der Tat, dass ist genau das, was ich hatte, aber das ist für die Profilerstellung, und wir haben mehrere datasets, nehmen Sie im 1-10er Bereich, so habe ich beschlossen, ich wollte ein bisschen mehr Auflösung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, Sie verwendet werden können, umfassen winbase.h, aber das scheint nicht mehr der Fall. Alle Quellen, die ich gesehen habe empfehlen windows.h, mit der option, WIN32_LEAN_AND_MEAN. Als Sie angegeben haben, die letzteren Optimierung nicht hilft.
Konnten Sie so etwas tun.
Nicht sauber, aber effizient. Diese "typedef" ist nicht wahrscheinlich, um sich jemals ändern.
Sind Mit Fenstern Ausgestattet.h und vorkompilierte Header verwenden. Btw, können Sie festlegen, WIN32_LEAN_AND_MEAN und dann undefiniert später!
Einen
DWORD
ist immer ein 32-bit unsigned int, also ist es eigentlich egal, ob SieDWORD
oderunsigned long
oderuint32_t
. Wenn alle drei Arten beziehen sich auf ein 32-bit-unsigned-int, der compiler geht zu betrachten Sie als gleichwertig.Da dieser Teil der Plattform-spezifische Dateien, ich glaube nicht, dass Sie brauchen, um sorgen über Portabilität so viel. Heck, Graben sich in den überschriften zu finden, die native Art der
DWORD
und setzen Sie einfach das typedef in Ihrem Kopf. C-Compiler akzeptieren doppelte typedefs, solange Sie die gleichen zugrunde liegenden Typ.DWORD
aus Gründen der Kompatibilität, also kann ich auch ausgraben, die geben Sie und verwenden Sie es direkt.Use this file:
include <IntSafe.h>
Ich würde sagen, nur definieren Sie sich selbst. So, es ist mehr Plattform-unabhängig (natürlich, ich weiß nicht, ob der rest des Codes erfordert Windows). Wenn Sie nicht möchten, dass zu tun, vorkompilierte Header verwenden.
Warum gehst du nicht stattdessen definieren Sie die Funktion zurück
int
? Dies ist eine sehr tragbare Art und völlig Scheidungen deinen code vonReich des bösenMicrosoft.DWORD
. Trotzdem danke 🙂Nicht mit einem DWORD. Ich habe gesehen, zu viel Windows-code portiert worden auf andere Plattformen später. Diese DWORDs zu einem echten problem bei der jeder hat Ihre eigene definition. Ich glaube nicht, dass es irgendwelche guten Gründe für die Verwendung von windows-spezifischen Typen, die in Schnittstellen.
Selbst wenn Ihr code wird nie eine Portierung auf eine andere Plattform, ich denke immer noch, der code sollte mit dem nativen Arten oder Ihre eigenen Arten (z.B., MyInt32, MyUInt64, etc), aber nichts von windows.h.
DWORD
. Trotzdem danke 🙂Wenn Sie besorgt sind, dass, wenn Sie Ihre cross-Plattform-Programm läuft auf Windows geladen werden, zu viele Windows-DLLs, nur weil Sie Ihre source-Codes #include <windows.h> ich glaube, Sie sind sich sorgen zu viel. Sogar Notepad zu laden, die Hälfte des bekannten Universums, und es bekannt, um zu laden und auszuführen, auf Anlass.
Wenn Sie besorgt sind, dass, wenn andere Entwickler nutzen Windows auf Ihrem cross-Plattform .h-Datei wird eine Menge von namespace-Verschmutzung in Ihrer Zusammenstellung Umgebungen, denke ich, dass Sie sich sorgen zu viel. 99,999% der Windows-Projekte haben bereits eine #include <windows.h> bevor Sie etwas von Ihr .h-Datei.
Gibt es einen <wtypes.h> wo du bist? Denn dort sehe ich:
Diese Datei liegt unter "...\VC98\INCLUDE" hier.. das ist für VC6, so würde ich dachte, es werden in späteren Versionen.
War ich nach das gleiche wie der OP und es gelöst, indem Sie die Sprach-header.
typedef
zu sein scheint, eingewickelt in ein#ifdef !defined(_WIN32) && !defined(_MPPC_)
, die kommentiert, wie "Der folgende code ist für Win16 nur". Also ich bin überrascht, dass es für Sie arbeitet...?_WIN32
ist zwar definiert, aber_MPPC_
nicht.. ich konnte nicht finden alle nützliche Informationen über dieses makro, so habe ich keine Ahnung, was es ist.. Portabilität ein Problem sein kann und ymmv, aber es funktioniert hier trotzdem kommentieren.. mir ist auch aufgefallen das Linie folgende Kommentar ist ein weiteres Niveau zu Verpacken, dass geht#ifndef WINAPI
mit dem Kommentar Wenn Sie nicht mit 3.1 Header..., aberWINAPI
ist nicht definiert, es sei denn, <windows.h> ist im Preis inbegriffen.Wie über -
#include <minwindef.h>
?#include
s dieser und enthält, z.B.sizeof(DWORD)
.) Googeln deutet darauf hin, dass es#define
s amax
makro, das ist ärgerlich, aber kein dealbreaker, wenn es ausgeschaltet werden kann!