2011-11-18 27 views
6

Lý do cho typedefs không được nhập mạnh? Có bất kỳ lợi ích nào mà tôi không thể nhìn thấy hay là do khả năng tương thích ngược? Xem ví dụ sau:Tại sao typedef không được đánh máy mạnh?

typedef int Velocity; 
void foo(Velocity v) { 
    //do anything; 
} 
int main() { 
    int i=4; 
    foo(i); //Should result in compile error if strongly typed. 
    return 0; 
} 

Tôi không yêu cầu cho cách giải quyết để có được một kiểu dữ liệu đánh máy mạnh mẽ nhưng chỉ muốn biết tại sao tiêu chuẩn không đòi hỏi typedefs được gõ mạnh?

Cảm ơn bạn.

+3

Vì C là ngôn ngữ cho những người muốn hoàn thành công việc, không dành cho những người muốn suy ngẫm về vẻ đẹp toán học của các hệ thống kiểu trừu tượng. (Là một người đánh giá cao cả hai hoạt động, tôi không đánh giá một trong hai hoạt động này). –

+3

@Stephen Canon: Ai nói rằng Abstract Type Systems không thể giúp bạn hoàn thành công việc? Gỡ lỗi các lỗi thời gian chạy do kết quả từ các loại bị lạm dụng vô tình chắc chắn không được tính là Bắt những điều đã hoàn thành trong cuốn sách của tôi. –

+0

@MichaelBorgwardt: Tôi chắc chắn không nói rằng họ không thể. Tuy nhiên, họ * có thể * bị lạm dụng. –

Trả lời

14

Bởi vì C không gõ mạnh và typedef có nguồn gốc của nó ở chỗ suy nghĩ

typedef chỉ là để thuận tiện và dễ đọc, nó không tạo ra một loại mới.

4

typedef chỉ là một từ khóa (giống như nhiều từ khóa khác). Hãy nghĩ về nó như typealias.

C hoàn toàn trái ngược ý tưởng về loại tương thích nào. Điều này cho phép ví dụ để liên kết các đơn vị biên dịch với nhau, ngay cả khi các khai báo của các hàm protopy chỉ được thực hiện với các kiểu tương thích và không phải với các kiểu giống hệt nhau. Tất cả điều này xuất phát từ sự cần thiết thực tế đơn giản trong cuộc sống hàng ngày, vẫn có thể đưa ra một số bảo đảm cho việc triển khai.

+2

Không phải là ý tưởng chính của C thực sự "Đó là tất cả chỉ là bit, chúng ta không che giấu quá nhiều"? –

+1

@MichaelBorgwardt, không, tôi không nghĩ vậy. Nếu không, nó sẽ không có mô hình chi tiết của các loại tương thích. –

0

Ngay cả khi Velocity là một loại riêng biệt từ int, mã của bạn sẽ biên dịch và hoạt động tốt do quy tắc chuyển đổi loại. Điều gì sẽ không hoạt động là chuyển một biểu thức kiểu Velocity * đến hàm mong đợi int *, v.v. Nếu bạn muốn đạt được dạng thực thi kiểu sau, chỉ cần làm cho Velocity một cấu trúc hoặc kiểu kết hợp có chứa một số nguyên duy nhất, và bây giờ bạn sẽ có một loại thực mới.

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