/ / tempo non definito quando si utilizza windows.h e WIN32_LEAN_AND_MEAN - c ++, windows, winsock, timeval

tempo indefinito quando si usa windows.h e WIN32_LEAN_AND_MEAN - c ++, windows, winsock, timeval

Per evitare conflitti con winsock2.h, voglio racchiudere la mia inclusione di windows.h con WIN32_LEAN_AND_MEAN (l'ho undef dopo windows.h in modo da non interferire con le applicazioni che includono le mie intestazioni). Questo fa sì che il tempo non sia definito quando winsock2.h non è incluso. Includere time.h non definisce nemmeno il tempo.

Come posso ottenere il tempo definito (a) senza avereincludere winsock2.h, (b) che non richiede applicazioni che includano le mie intestazioni per includere winsock2.h prima delle intestazioni, (c) consentire all'applicazione di includere winsock2.h se ne hanno bisogno e (d) non dover definire me stesso il tempo , perché potrebbe già essere definito da un'intestazione che include l'applicazione padre?

risposte:

1 per risposta № 1

Ricorda che WIN32_LEAN_AND_MEAN è un ottimizzazione delle prestazioni del compilatore. Usarlo fa compilare le tue app in modo un po 'più veloce a scapito dell'omissione di alcune parti meno utilizzate dell'API di Windows.

È possibile utilizzare uno dei dis- positivi più granulari (NOIMM, ecc.), Ma questi hanno un impatto ancora minore sul tempo di compilazione rispetto a quello di LEAN_AND_MEAN.

A meno che il tuo progetto non sia molto grande e abbia tempi di compilazione lunghi e onerosi, smetterei di usare WIN32_LEAN_AND_MEAN.

Martyn


1 per risposta № 2

Non definisco né LEAN_AND_MEANs, ma faccio esplicitamente quanto segue per ciascuno dei "NO" prima di includere windows.h

//  Exclude Input Method Manager (International stuff...one day)
#if !defined    NOIMM
#define NOIME
#define NOIMM
#endif

//  Exclude Metafile API
#if !defined    NOMETAFILE
#define NOMETAFILE
#endif

Questo mi permette di usare lo stesso StdAfx.h. Con VS2010 posso includere Winsock2 dopo windows.h senza conflitti.

Stdafx è un po 'più lungo, ma documenta chiaramente ciò che è incluso ed escluso.


1 per risposta № 3

Questo è il modo con cui gestisco i problemi winsock2.h (assumendo Visual C ++):

  • Ho configurato il sistema di generazione per passare sempre dentro /D_WINSOCKAPI_ al compilatore sulla riga di comando in modo che nessun file di intestazione di winsock venga incluso implicitamente.
  • Quando voglio includere winsock2.h, Lo faccio tramite un file di intestazione del proxy che fa un po 'di magia per il preprocessore per me.

Ecco come funziona il mio file di intestazione:

#pragma push_macro("_WINSOCKAPI_")
#undef _WINSOCKAPI_
#include <winsock2.h>
#pragma pop_macro("_WINSOCKAPI_")

Se lo fai, non ne hai bisogno #define WIN32_LEAN_AND_MEAN e puoi usare winsock2.h solo quando necessario


0 per risposta № 4

Non penso che quello che vuoi sia possibile. La struttura temporale è definita in winsock.h e winsock2.h, quindi devi includere uno di quelli per ottenere la definizione. Se non si definisce WIN32_LEAN_AND_MEAN, windows.h includerà winsock.h; ciò rende impossibile includere winsock2.h. Se si definisce WIN32_LEAN_AND_MEAN, nessuno dei file di intestazione di winsock viene incluso automaticamente, quindi non si ottiene la definizione per timeval. Penso che la tua migliore opzione sia richiedere alle applicazioni di includere esplicitamente uno degli header di winsock.