2012-08-22 55 views
33

Là typeof trong C, thực sự là một toán tử?
Tôi đang suy nghĩ vì không có đa hình trong C, rằng không có gì để làm tại thời gian chạy. Đó là, câu trả lời cho typeof được biết đến tại thời gian biên dịch. (Tôi không thể nghĩ đến việc sử dụng typeof mà sẽ không được biết tại thời gian biên dịch.) Vì vậy, nó dường như là một chỉ thị thời gian biên dịch hơn là một toán tử.toán tử typeof trong C

Loại sử dụng bất kỳ thời gian chạy (bộ xử lý) nào (trong GCC)?

+17

C không có toán tử 'typeof', đó là phần mở rộng của trình biên dịch. –

Trả lời

37

Kể từ typeof là một phần mở rộng trình biên dịch, không có thực sự là một định nghĩa cho nó, nhưng theo truyền thống của C nó sẽ là một nhà điều hành, ví dụ sizeof_Alignof cũng được xem như là một nhà khai thác.

Và bạn bị nhầm lẫn, C có các loại động chỉ được xác định tại thời gian chạy: các loại biến đổi (VM).

size_t n = strtoull(argv[1], 0, 0); 
double A[n][n]; 
typeof(A) B; 

chỉ có thể được xác định trong thời gian chạy.

+11

Đừng ngại liên kết đến [nguồn thú vị] (http://gustedt.wordpress.com/2011/01/09/dont-be-afraid-of-variably-modified-types/) liên quan đến chủ đề này :) –

+1

@NikolaiRuhe, sẽ không nghĩ rằng đó là tài nguyên chính cho các loại máy ảo ... nhưng nếu bạn nói vậy :) –

+0

Chỉ cần [yêu cầu google] (http://www.google.com/search?q=VM + VLA + C) –

3

Nó không phải chính xác một nhà điều hành, chứ không phải một từ khóa. Và không, nó không thực hiện bất kỳ phép thuật thời gian chạy nào.

+0

Lý do giảm giá? –

23

Đó là phần mở rộng của GNU. Tóm lại, đó là một cách thuận tiện để khai báo một đối tượng có cùng kiểu với một đối tượng khác. Ví dụ:

int x;   /* Plain old int variable. */ 
typeof(x) y; /* Same type as x. Plain old int variable. */ 

Nó hoạt động hoàn toàn tại thời gian biên dịch và nó chủ yếu được sử dụng trong các macro. Một ví dụ nổi tiếng về macro dựa trên typeofcontainer_of.

+4

Đừng nghĩ rằng nó hoạt động hoàn toàn tại biên dịch, mặc dù tôi phải thừa nhận rằng tôi đã không kiểm tra: Tôi nghĩ rằng nó cũng làm việc cho VLA và các loại máy ảo khác. Vì vậy, điều này sau đó chỉ có thể được xác định tại thời gian chạy. –

+0

@ JensGustedt Bạn nói đúng. – cnicutar