2010-10-11 7 views
10

Vengo da uno sfondo in cui i puntatori dovrebbero generalmente essere confrontati con "NULL" e interi con "0".Test per un handle di Windows non valido: dovrei confrontare con 'NULL', '0' o anche 'nullptr'?

Poiché non ho percepito che le maniglie di Windows siano "puntatori" nel senso puro (essendo "handle"), ho preso l'abitudine di confrontarli con 0 anziché con "NULL".

Chiaramente sono implementati internamente come puntatori al giorno d'oggi, ma personalmente ritengo che sia meramente per acquisire un certo tipo di sicurezza piuttosto che perché sono intrinsecamente indicatori.

In ogni caso, ho appena notato che l'aiuto per CreateIC che restituisce un HDC indica che se la funzione non riesce, restituisce "NULL".

Ora sono confuso - e mi sto chiedendo cosa pensano gli altri - è più corretto considerare un handle di Windows come un puntatore (e quindi confrontarlo con 'NULL' o 'nullptr' per i moderni compilatori) o dovrebbe è considerato un numero intero?

+0

Le maniglie non sono puntatori, ma indici a un tavolo. Consultare MSDN per i valori di ritorno. E comunque, perché 'if (x) {..' non va bene? – ruslik

+1

Grazie per questo - chiamami vecchio stile, ma normalmente riservo la notazione 'if (x)' per le espressioni che valutano i risultati 'bool'. Non so se si tratta di buone o cattive pratiche, ma è quello a cui sono abituato. –

risposta

8

confrontarlo con il valore di ritorno di errore documentato. Ciò significa che si dovrebbe confrontare contro INVALID_HANDLE, 0, -1, diverso da zero, o <=32 (non sto scherzando con l'ultimo, vedi ShellExecute).

+1

Grazie per la risposta - Immagino hai ragione, non c'è molta coerenza e dovrei solo fare quello che mi dice l'MSDN. –

1

Penso che il valore INVALID_HANDLE_VALUE di solito sia il valore "non valido" appropriato per gli handle di Windows ... e che valuti a -1.

+4

Questo non è sempre vero. Dipende da quale API stai chiamando ... che è un dolore ENORME :( – Goz

+0

Se lo fai: 'HWND hwnd = INVALID_HANDLE_VALUE' ottieni un errore in fase di compilazione, il che mi sembra strano –

3

Per rispondere alla tua domanda: il tipo HANDLE è dichiarata in winnt.h come

typedef PVOID HANDLE; 

Quindi, tecnicamente si tratta di un puntatore.

Tuttavia, vorrei solo usare ciò che è documentato; se la documentazione indica che NULL viene restituito, io uso esattamente quello a meno che le prove dimostrino che la documentazione non è corretta.

Non penso nemmeno a puntatori o interi. NULL è solo un valore opaco (in questa situazione) e HANDLE è un tipo opaco per me e non mi preoccupo di cercare cosa sia #define 'd a.

Problemi correlati