timeval undefined bei der Verwendung von windows.h und WIN32_LEAN_AND_MEAN
Zur Vermeidung von Konflikten mit winsock2.h, möchte ich wickle meine include windows.h mit WIN32_LEAN_AND_MEAN (undef ich es nach windows.h also nicht zu stören-Anwendungen mit meinem Header). Dies bewirkt, dass timeval werden nicht definiert, wenn winsock2.h ist nicht im Lieferumfang enthalten. Einschließlich der Zeit.h nicht definieren timeval entweder.
Wie bekomme ich timeval definiert (a), ohne zu zählen winsock2.h, (b) die Anwendungen, die nicht erfordern, dass mein Header zu beinhalten winsock2.h vor meinem Header, (c) und Antrag auf Aufnahme winsock2.h, wenn Sie Sie brauchen, und (d) nicht zu definieren timeval mich selbst, da kann es schon sein definiert sich durch die header der übergeordneten Anwendung ist inklusive?
- Sie können nicht einfach undefiniert es nach dem einbinden von windows.h, wie Sie bereits ändern Sie das Verhalten der späteren re-darunter es (denken in Bezug auf die include-guards oder pragma once). WIN32_LEAN_AND_MEAN (und anderen wie "header-Konfiguration" Makros") sollte idealerweise Projekt-weiten Einstellungen; aber abgesehen, dass Sie weiterhin diese verwenden müssen konsequent in eine übersetzungseinheit. (Gegen-Beispiel: das standard-makro NDEBUG definiert ist, Veränderungen zu ermöglichen, also behaupten.h/cassert Verhalten sich sehr anders als andere-Header, und ist oft eine Quelle der Verwirrung. Viele Projekte, deshalb vermeiden Sie es und verwenden Sie benutzerdefinierte DEBUG-Makros.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Denken Sie daran, dass WIN32_LEAN_AND_MEAN ist eine compiler-performance-Optimierung. Mit macht es Ihre apps kompilieren etwas schneller auf Kosten der Auslassung einiger weniger verwendete Teile der Windows-API.
Könnten Sie verwenden Sie eine der detailliertere deaktiviert (NOIMM, etc), aber diese haben noch weniger Einfluss auf die compile-Zeit, als die LEAN_AND_MEAN man tut.
Sei denn, Ihr Projekt ist sehr groß und hat lange, umständliche kompilieren mal würde ich einfach aufhören, WIN32_LEAN_AND_MEAN.
Martyn
Ich nicht definieren, entweder der LEAN_AND_MEANs, stattdessen habe ich explizit die folgenden für jeden der 'NOs' vor, einschließlich windows.h
Dies ermöglicht mir die Verwendung der gleichen StdAfx.h. Mit VS2010 kann ich zählen Winsock2 nach windows.h ohne Konflikte.
Stdafx ist ein wenig länger, aber deutlich dokumentiert, was ein-und ausgeschlossen werden.
Dies ist, wie ich den Umgang mit Problemen mit
winsock2.h
(vorausgesetzt, Visual C++):/D_WINSOCKAPI_
an den compiler auf der Kommandozeile, so dass kein winsock-header-Dateien sind immer implizit enthalten.winsock2.h
mache ich es über einen proxy-header-Datei, macht einige Präprozessor-Magie für mich.Dies ist, wie meine header-Datei funktioniert:
Wenn Sie dies tun, dann brauchen Sie nicht zu
#define WIN32_LEAN_AND_MEAN
und Sie könnenwinsock2.h
nur bei Bedarf.Ich glaube nicht, dass das, was Sie wollen, ist möglich. Die struct timeval ist definiert in winsock.h und winsock2.h, so haben Sie, um einen von denen zu Holen Sie sich die definition. Wenn Sie nicht definieren, WIN32_LEAN_AND_MEAN, windows.h gehören winsock.h; dies macht es unmöglich, winsock2.h. Wenn Sie define WIN32_LEAN_AND_MEAN, weder von der winsock-header-Dateien sind automatisch enthalten, damit Sie nicht die definition für timeval. Ich denke, die beste option, um Anwendungen erfordern eine winsock-Header explizit.