2010-09-23 30 views
16

Given:typedef cơ bản toán hạng cú pháp

typedef type-declaration synonym; 

tôi có thể xem như thế nào:

typedef long unsigned int size_t; 

tuyên bố size_t như một từ đồng nghĩa với long unsigned int, tuy nhiên tôi (biết nó nhưng) không thể nhìn thấy chính xác cách thực hiện:

typedef int (*F)(size_t, size_t); 

tuyên bố F như một từ đồng nghĩa với pointer to function (size_t, size_t) returning int

hai toán hạng typedef của (type-declaration, synonym) trong ví dụ đầu tiên là long unsigned intsize_t.

Hai đối số để nhập typedef trong khai báo F hoặc có thể là phiên bản quá tải của typedef?

Nếu có sự khác biệt có liên quan giữa C và C++, vui lòng giải thích nếu không, tôi chủ yếu quan tâm đến C++ nếu điều đó hữu ích.

+0

Chỉ cần làm rõ nguồn gốc của cú pháp được ban đầu là từ đây: http://msdn.microsoft.com/en-us/library /05w82thz%28v=VS.100%29.aspx –

+0

đừng tin mọi thứ mà Microsoft nói với bạn ;-) –

+0

Khai báo con trỏ hàm là một số cú pháp kỳ lạ nhất trong C. Điều duy nhất tôi thấy là weirder là con trỏ- cú pháp thành viên trong C++ ... Và đó là vì nó giống cú pháp con trỏ hàm C. –

Trả lời

31

Khai báo kiểu bằng cách sử dụng typedef giống như khai báo biến tương ứng, chỉ với typedef được thêm vào trước. Vì vậy,

 int x; // declares a variable named 'x' of type 'int' 
typedef int x; // declares a type named 'x' that is 'int' 

Đó là giống hệt nhau với các loại con trỏ hàm:

 int(*F)(size_t); // declares a variable named F of type 'int(*)(size_t)' 
typedef int(*F)(size_t); // declares a type named 'F' that is 'int(*)(size_t)' 

Nó không phải là một "trường hợp đặc biệt;" đó chỉ là những gì một loại con trỏ chức năng trông giống như.

+0

Điều này rất hữu ích, tôi có thể thấy ngay sự khác biệt khó hiểu là 'hai đối số', tôi có đúng trong việc làm sáng tỏ điều đó cho 'typedef int (* F) (size_t);' chỉ có một đối số để gõ không? –

+1

@Peter: Nó không thực sự là một đối số ở tất cả; nó chỉ là cú pháp của một tuyên bố. 'int (*) (size_t)' là kiểu của một con trỏ tới một hàm trả về một 'int' và có một tham số duy nhất của kiểu' size_t'. Một hàm mà một điểm con trỏ như vậy phải lấy một đối số (thuộc kiểu 'size_t'), nhưng đó là" đối số "duy nhất ở đây. –

+3

@Peter: 'typedef' không phải là hàm, nó không lấy đối số. Nó biến một khai báo biến thành một khai báo kiểu. – GManNickG

0

typedef đang sử dụng cú pháp khai báo.

Con trỏ hàm typedef giống như bạn sử dụng để khai báo con trỏ hàm. Ngoại trừ trong trường hợp đó bạn đang khai báo một loại, không phải là biến.

1

Thay vì nghĩ đến typedef là một hoạt động có hai tham số (loại và từ đồng nghĩa), hãy coi đó là loại vòng loại. Để khai báo một biến có tên F đó là một con trỏ hàm chấp nhận hai size_t thông số và trở int bạn sẽ phải chỉ:

int (*F)(size_t, size_t); 

Thêm kiểu vòng loại typedef và thay vì khai báo một biến, bạn đã tuyên bố một loại bí danh thay vì .

7

Đó không phải là cú pháp chính thức của typedef, nó chỉ là một trong những mẫu mà nó có thể thực hiện. Trong tiêu chuẩn C 6.7.1, typedef được định nghĩa cú pháp như một bộ định danh lớp lưu trữ (như extern hoặc static). Nó sửa đổi một khai báo, để khai báo khai báo một loại bí danh thay vì một đối tượng.

typedef không phải là chức năng hoặc toán tử, vì vậy khái niệm "đối số", "toán hạng" hoặc "quá tải" không áp dụng cho nó. Nó chỉ cho trình biên dịch biết bạn đang khai báo loại gì.

Trong C++, typedef được cú pháp định nghĩa là một decl-specifier, nó không phải là một lưu trữ-lớp-specifier. bộ lưu trữ-class-specifiers cũng là từ chối thông số và do đó là friend. Tôi không nghĩ rằng điều này làm cho bất kỳ sự khác biệt thực tế, đó là một cách khác để nói cùng một điều C nói, nhưng đó là 7,1 của tiêu chuẩn C++ nếu bạn muốn có một cái nhìn cho chính mình. Tôi thú nhận điều đó khiến tôi bối rối trong thời gian này.

+0

+1 để tham chiếu. – linuxuser27

+0

Điều này cũng rất hữu ích mặc dù tôi vẫn có thể làm với làm rõ về số lượng đối số để typedef, là nó có giá trị bao gồm cú pháp chính xác của typedef ở đây hoặc có lẽ một liên kết để xây dựng trên câu đầu tiên của bạn? –

+2

@Peter: 'typedef' không có bất kỳ đối số nào, giống như' static' không có đối số hoặc 'const' không có đối số. Nó cũng không có cú pháp riêng. Đó là một công cụ sửa đổi bị kẹt ở đầu khai báo, vì vậy nó là một phần của cú pháp khai báo. Cú pháp khai báo và ngữ nghĩa về cơ bản chiếm toàn bộ các chương 7 và 8 của tiêu chuẩn C++. –

2

giả định ban đầu của bạn về cú pháp typedef có cấu trúc

typedef type-declaration synonym; 

là hoàn toàn không chính xác. Cú pháp Typedef không có cấu trúc đó và không bao giờ có.

Cú pháp typedef là một khai báo thông thường, giống như bất kỳ khai báo nào khác trong ngôn ngữ C. Từ khóa typedef chỉ đơn giản là một bộ khai báo khai báo cho biết rằng tên được khai báo là một tên typedef và không phải là một biến, hàm thiết kế hoặc cái gì khác.

Bạn có thể sử dụng nhiều declarators trong khai báo typedef cùng, ví dụ

typedef int TInt, *TIntPtr, (*TIntFuncPtr)(void), TIntArr10[10]; 
Các vấn đề liên quan