Ai đó có thể vui lòng giải thích chính xác lý do tại sao typedef
s/#define
giây sau đây đã được xác định? Họ có giá trị gì so với bản gốc?Các loại dữ liệu Windows ... tại sao lại dư thừa/không mô tả?
typedef char CHAR;
#define CONST const
typedef float FLOAT;
typedef unsigned __int64 DWORD64; //A 64-bit "double"-word?!
typedef ULONGLONG DWORDLONG; //What's the difference?
typedef ULONG_PTR DWORD_PTR; //What's the difference?
typedef long LONG_PTR; //Wasn't INT_PTR enough?
typedef signed int LONG32; //Why not "signed long"?
typedef unsigned int UINT; //Wait.. UINT is "int", "LONG" is also int?
typedef unsigned long ULONG; //ULONG is "long", but LONG32 is "int"? what?
typedef void *PVOID; //Why not just say void*?
typedef void *LPVOID; //What?!
typedef ULONG_PTR SIZE_T; //Why not just size_t?
Và tốt nhất của tất cả:
#define VOID void //Assuming this is useful (?), why not typedef?
lý do đằng sau những gì? Có một số loại trừu tượng mà tôi không hiểu?
Sửa:
Đối với những người nhắc đến trình biên dịch chéo compatilibity:
Câu hỏi của tôi là không về việc tại sao họ không sử dụng unsigned long long
thay vì, nói, DWORD64
. Câu hỏi của tôi là về lý do tại sao mọi người sử dụng DWORD64
thay vì ULONG64
(hoặc ngược lại)? Không phải cả hai trong số đó là typedef
có chiều rộng là 64 bit không?
Hoặc, như một ví dụ khác: Ngay cả trong trình biên dịch "giả thiết" có nghĩa là đánh lừa chúng ta trong mọi khía cạnh, sự khác biệt giữa ULONG_PTR
và UINT_PTR
và DWORD_PTR
là gì? Không phải tất cả các loại dữ liệu trừu tượng này đều có cùng ý nghĩa - SIZE_T
?
Tuy nhiên, tôi là hỏi lý do tại sao họ đã sử dụng ULONGLONG
thay vì long long
- là có bất kỳ sự khác biệt tiềm năng trong ý nghĩa, được bao phủ bởi không long long
cũng không DWORDLONG
?
Tôi sẽ nghi ngờ rất nhiều những harken từ độ tuổi tối tăm của win16, nhưng tôi sẽ để lại cho những người thực sự đã viết mã cửa sổ trở lại trong thời đại của yore để trả lời :) – bdonlan
@bdonlan: Haha okay. :) – Mehrdad
Có rất nhiều điều ảnh hưởng đến lịch sử của các loại này. Khi đã xác định một lần, bạn không bao giờ có thể lấy lại. #define VOID void đã được thực hiện, vì ban đầu void * ban đầu không có trong tiêu chuẩn C (không thể tìm thấy một liên kết ...). Vì vậy, một số trình biên dịch đã không nhận ra nó. Nhưng nếu bạn loại bỏ nó ngay bây giờ, bạn phá vỡ mã. Và không ai muốn ngắt mã của mình, khi cập nhật SDK. Đã có quá nhiều vấn đề khi cập nhật, tại sao lại phá vỡ điều này trong một số mô-đun cũ mà không được xúc động cho 'thế kỷ' nhưng bây giờ đột nhiên không biên dịch nữa. – Christopher