2010-10-11 16 views
10

Tôi đến từ một nền tảng theo đó con trỏ thường được so sánh với 'NULL' và số nguyên với '0'.Thử nghiệm để xử lý cửa sổ không hợp lệ: tôi có nên so sánh với 'NULL', '0' hoặc thậm chí 'nullptr' không?

Vì tôi không nhận thấy Windows xử lý là 'con trỏ' theo nghĩa thuần túy (là 'xử lý'), tôi đã có thói quen so sánh chúng với 0 chứ không phải là 'NULL'.

Rõ ràng chúng được triển khai nội bộ dưới dạng con trỏ ngày nay, nhưng cá nhân tôi cho rằng chỉ đơn thuần là để có được một số loại an toàn hơn là vì chúng là con trỏ nội tại.

Dù sao, tôi chỉ nhận thấy rằng trợ giúp cho CreateIC trả về trạng thái HDC rằng nếu hàm không thành công thì trả về 'NULL'.

Bây giờ tôi đang bối rối - và tự hỏi những gì người khác nghĩ - là nó chính xác hơn để xem xét một xử lý Windows là một con trỏ (và do đó kiểm tra nó với 'NULL' hoặc 'nullptr' cho trình biên dịch hiện đại) hoặc nên nó được coi là một số nguyên?

+0

Xử lý không phải là con trỏ, nhưng chỉ mục cho một bảng. Tham khảo MSDN để biết các giá trị trả lại. Và dù sao, tại sao 'if (x) {..' không tốt? – ruslik

+1

Cảm ơn bạn - hãy gọi cho tôi theo kiểu cũ, nhưng tôi thường đặt ký hiệu 'if (x)' cho các biểu thức đánh giá kết quả 'bool'. Tôi không biết đây có phải là thực hành tốt hay xấu, nhưng đó là những gì tôi thường làm. –

Trả lời

8

So sánh nó với giá trị trả lại lỗi được ghi lại tài liệu. Điều đó có nghĩa là bạn nên so sánh nó với INVALID_HANDLE, 0, -1, khác 0 hoặc <=32 (Tôi không đùa với cái cuối cùng, xem ShellExecute).

+1

Cảm ơn câu trả lời đó - tôi đoán bạn nói đúng, không có nhiều nhất quán và tôi chỉ nên làm những gì MSDN nói với tôi. –

1

Tôi nghĩ rằng INVALID_HANDLE_VALUE thường là giá trị 'không hợp lệ' hợp lệ cho các cửa sổ xử lý ... và đánh giá là -1.

+4

Thats không phải lúc nào cũng đúng. Nó phụ thuộc vào những gì bạn đang gọi API ... đó là một nỗi đau HUGE: ( – Goz

+0

Nếu bạn làm: 'HWND hwnd = INVALID_HANDLE_VALUE' bạn nhận được một lỗi thời gian biên dịch. Điều đó có vẻ kỳ quặc với tôi –

3

Để trả lời câu hỏi của bạn: loại HANDLE được khai báo trong winnt.h như

typedef PVOID HANDLE; 

Do đó, về mặt kỹ thuật nó là một con trỏ.

Tuy nhiên, tôi sẽ chỉ sử dụng bất kỳ nội dung gì được ghi lại; nếu tài liệu nêu rõ rằng NULL được trả về, tôi sử dụng chính xác điều đó trừ khi bằng chứng cho thấy tài liệu không chính xác.

Tôi thậm chí không nghĩ về con trỏ so với số nguyên. NULL chỉ là một giá trị mờ (trong tình huống này) và HANDLE là một loại mờ đục đối với tôi và tôi không bận tâm tìm kiếm những gì nó là #define 'd.

Các vấn đề liên quan