2011-12-25 33 views
8

Có thể kiểm tra loại biến nào tại bất kỳ điểm nào trong suốt mã không?Làm thế nào để kiểm tra loại biến trong C khi chạy?

Ví dụ: giả sử, tôi khai báo char y = 1; và chức năng int SomeFunction (int). Sau đó, tôi sẽ vượt qua y đến someFunction, số này sẽ được chuyển đổi thành int và cuối cùng là int sẽ được trả lại.

Tôi biết điều này vì khai báo chức năng. Tuy nhiên, tôi muốn xác nhận rằng bên trong số someFunction, biến số thực tế là loại int và biến được trả lại từ someFunction cũng là int.

Điều này có thể được thực hiện trong C hoặc khai báo hàm hay không nên dựa vào thay vào đó? Ngôn ngữ lập trình C có cung cấp bất kỳ cơ chế nào để kiểm tra loại biến trong thời gian chạy không?

+2

Biến bên trong 'someFunction' là _in fact_ một' int' vì bạn nói vậy. – knittl

+0

Vì vậy, ngôn ngữ lập trình C không có cơ chế để kiểm tra kiểu biến trong thời gian chạy? – JAM

+7

Trong C, các kiểu chỉ tồn tại ở thời gian biên dịch. Khi chạy, nó chỉ là một loạt các bit di chuyển xung quanh. – Mat

Trả lời

6

Trong mã của bạn, bạn có thể dựa vào thực tế là các loại bạn được trao tương ứng với cách chúng được khai báo. Bạn không thể viết bất kỳ chương trình không tầm thường nào nếu đó không phải là trường hợp.

Thông tin loại, trong C, chỉ có sẵn tại thời gian biên dịch. Trong thời gian chạy, không có thông tin nào có sẵn để không có cách xây dựng tiêu chuẩn, ví dụ, cho biết loại đối tượng nào đang ẩn đằng sau một con trỏ ngẫu nhiên.
Nếu bạn cần loại thông tin đó, hãy xem trình biên dịch của bạn có mở rộng không (hoặc không biết nếu có), hoặc sử dụng khung cung cấp cơ sở hạ tầng cho điều đó (glib có những thứ như tôi tin).
Hoặc cuộn của riêng bạn nếu bạn thực sự thực sự cần.

Hoặc sử dụng C++ có hỗ trợ thông tin kiểu thời gian chạy và nói chung là một hệ thống kiểu phức tạp hơn, nhưng đó là một ngôn ngữ hoàn toàn khác.

+0

Cảm ơn bạn Mat. Câu trả lời hay: – JAM

+0

@Mat, Về * "Bạn không thể viết bất kỳ chương trình không tầm thường nào nếu đó không phải là trường hợp." *, Vậy bạn có nói rằng không có bất kỳ chương trình PHP/Javascript không tầm thường nào không? – Pacerier

+1

@Pacerier: PHP và Javascript (và một nhóm khác) được nhập động và ngữ nghĩa ngôn ngữ được xây dựng xung quanh đó. C được gõ tĩnh. – Mat

0

Loại C chủ yếu tồn tại ở thời gian biên dịch.

Bạn có thể tăng cấp độ cảnh báo trình biên dịch của mình để kiểm tra tốt hơn (EG gcc -ansi -pedantic -Wall), nhưng tôi tin rằng một số thứ vẫn sẽ bị ép buộc khi cần thiết.

Bạn có thể sử dụng liên minh để quản lý loại thủ công cho một số tác vụ, nhưng trong C, thường tốt hơn là chỉ dựa vào trình biên dịch của bạn để kiểm tra loại.

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