Giải Pháp Tạm Thời - nói dối e blog

Giải Pháp Tạm Thời

Vấn đề với cảnh báo cấp độ 4 của VC6

Vấn đề với cảnh báo cấp độ 4 của VC6

Sáng nay, mình vừa thử bật mức cảnh báo 4 (warning level 4) trên trình biên dịch VC6 để quét toàn bộ dự án của mình. Trong quá trình xử lý hàng loạt lỗi cảnh báo nghiêm trọng, mình phát hiện một chi tiết thú vị liên quan đến thư viện hệ thống của Windows 😅

Vấn đề cụ thể nằm trong tệp tin RPCASYNC.H - nơi thiếu khai báo trước cấu trúc struct _RPC_ASYNC_STATE. Điều này khiến trình biên dịch đưa ra cảnh báo đỏ rực mỗi khi bạn include file windows.h:

... \VC98\include\rpcasync.h(45) : warning C4115: '_RPC_ASYNC_STATE' : named type definition in parentheses

Mình đã khắc phục tạm thời bằng cách thêm dòng khai báo “ma thuật” này trước khi include windows.h:

1
struct _RPC_ASYNC_STATE;

Phân tích kỹ thuật

Lỗi này thường xuất hiện khi:

  1. Bạn sử dụng trình biên dịch VC++ 6.0 lỗi thời (thế kỷ trước luôn!)
  2. Bật mức cảnh báo cao nhất (level 4) - nơi phát hiện mọi chi tiết nhỏ nhất
  3. Project có include các thư viện Windows API gốc

Thực tế, đây là lỗi thiếu sót trong bản header file gốc của Microsoft từ thời Windows 2000 SDK. Nếu bạn có thể nâng cấp lên Visual Studio đời mới (ít nhất là VS2010 trở lên), vấn đề này sẽ tự động biến mất. Nhưng nếu vẫn phải trung thành với VC6 để chạy legacy code thì đây là giải pháp hiệu quả nhất.

Mở rộng thêm

Bạn có thể tạo một file stdafx.h riêng chứa các khai báo “chống cảnh báo” như thế này để tránh làm rối các file header chính của hệ thống. Một trick khác là sử dụng директива tiền xử lý:

1
2
3
#pragma warning(disable:4115)
#include <windows.h>
#pragma warning(default:4115)

Tuy nhiên theo kinh nghiệm của mình, cách đầu tiên vừa gọn vừa dễ bảo trì hơn nhiều 🧐

0%