2010-10-11 8 views
10

Vengo de un fondo donde los punteros generalmente se deben comparar con 'NULL' y enteros con '0'.Comprobación de un identificador de ventanas no válido: ¿debo comparar con 'NULL', '0' o incluso 'nullptr'?

Dado que no percibí que los controladores de Windows fueran 'indicadores' en el sentido puro (que son 'identificadores'), me acostumbré a compararlos con 0 en lugar de con 'NULO'.

Claramente están implementados internamente como punteros hoy en día, pero personalmente considero que se trata simplemente de adquirir algún tipo de seguridad en lugar de porque intrínsecamente son punteros.

De todos modos, acabo de notar que la ayuda para CreateIC que devuelve un HDC indica que si la función falla, entonces devuelve 'NULL'.

Ahora estoy confundido, y me pregunto qué opinan otras personas, ¿es más correcto considerar un identificador de Windows como un puntero (y por lo tanto comprobarlo contra 'NULL' o 'nullptr' para los compiladores modernos) o debería se considera un número entero

+0

Las asas no son punteros, sino índices de una tabla. Consulte MSDN para los valores de retorno. Y de todos modos, ¿por qué 'if (x) {..' no es bueno? – ruslik

+1

Gracias por este - llámame anticuado, pero normalmente me reservo la notación 'if (x)' para las expresiones que evalúan los resultados 'bool'. No sé si esta es una buena o mala práctica, pero es a lo que estoy acostumbrado. –

Respuesta

8

Compárelo con el valor de retorno de error documentado. Eso significa que debe compararlo contra INVALID_HANDLE, 0, -1, distinto de cero, o <=32 (no estoy bromeando con el último, vea ShellExecute).

+1

Gracias por esa respuesta - supongo tienes razón, no hay mucha consistencia y debería hacer lo que me dice MSDN. –

1

Creo que INVALID_HANDLE_VALUE suele ser el valor correcto 'no válido' para los identificadores de ventanas ... y eso se evalúa como -1.

+4

Eso no siempre es verdad. Depende de qué API esté llamando ... que es un ENORME dolor :( – Goz

+0

Si lo hace: 'HWND hwnd = INVALID_HANDLE_VALUE' obtendrá un error de tiempo de compilación. Lo cual me parece extraño. –

3

Para responder a su pregunta: el tipo HANDLE se declara en winnt.h como

typedef PVOID HANDLE; 

Por lo tanto, técnicamente es un puntero.

Sin embargo, solo usaría lo que esté documentado; si la documentación indica que se devuelve NULL, uso exactamente eso a menos que la evidencia muestre que la documentación es incorrecta.

Ni siquiera pienso en los punteros contra los enteros. NULL es solo un valor opaco (en esta situación) y HANDLE es un tipo opaco para mí y no me molesto en buscar lo que es #define 'd a.

Cuestiones relacionadas