2015-04-23 20 views
6

tôi đã thực hiện này của một struct:typedef tương đương cho một con trỏ đến struct

struct NodoQ { 
    Etype elem; 
    NodoQ *sig; 
}; 

là mã này dưới đây,

typedef NodoQ *PtrNodoQ; 
PtrNodoQ ppio, fin; 

giống như thế này?

NodoQ* ppio; 
NodoQ* fin; 
+0

Có, chúng giống nhau. –

+0

Tôi nghĩ vậy, nhưng tại sao không hỏi trình biên dịch? –

+0

Tôi đã không cố gắng gây ra tôi có tùy chọn thứ hai ở khắp mọi nơi trong mã của tôi, và chỉ không muốn mất một thời gian ... do đó khi sử dụng typedef NodoQ * PtrNodoQ. PtrNodoQ trở thành bí danh của NodoQ * Tôi đoán là cách tránh '*' và dễ đọc hơn ... cảm ơn bạn Michael và Mark – HoNgOuRu

Trả lời

6

là mã này dưới đây,

typedef NodoQ *PtrNodoQ; 
PtrNodoQ ppio, fin; 

giống như thế này?

NodoQ* ppio; 
NodoQ* fin; 

Vâng, nó dẫn đến các loại con trỏ chính xác tương tự cho ppiofin.


Đối với nhận xét của bạn

"Tôi không cố gắng vì tôi đã lựa chọn thứ hai ở khắp mọi nơi trong mã của tôi, và chỉ không muốn để mất một thời gian ..."

Bạn có thể dễ dàng kiểm tra nó:

void foo(PtrNodoQ p) { 
} 

void bar(NodoQ* p) { 
    foo(p); 
} 

void baz() { 
    NodoQ n; 
    foo(&n); 
    bar(&n); 
} 

biên dịch hoàn toàn tốt đẹp, không có cảnh báo hoặc lỗi chuyển đổi loại không hợp lệ.


Ngoài ra bạn có thể tìm thấy câu trả lời một cách nhanh chóng trong this excellent reference (tôi nhấn mạnh):

Các typedef-tên là bí danh với nhiều loại hiện, và là không khai báo các loại mới. Typedef không thể được sử dụng để thay đổi ý nghĩa của tên kiểu hiện có (bao gồm tên typedef). Sau khi khai báo, một typedef-tên chỉ có thể được redeclared để tham khảo cùng một loại một lần nữa. Các tên Typedef chỉ có hiệu lực trong phạm vi mà chúng có thể nhìn thấy: các hàm khác nhau hoặc các khai báo lớp có thể định nghĩa các kiểu có tên giống nhau với ý nghĩa khác nhau.

+0

Thực tế là nó biên dịch không chỉ ra rằng các loại là giống nhau, vì có thể có chuyển đổi tự động được áp dụng. Tôi thích câu trả lời trích dẫn tiêu chuẩn. –

+0

@MarkRansom _ "vì có thể có chuyển đổi tự động đang được áp dụng" _ Cấu trúc 'NodoQ' từ OP không chỉ ra điều đó theo bất kỳ cách nào. Nhưng có, tôi thích câu trả lời khác nữa, đó là lý do tại sao tôi đã upvoted nó như là 1 :) –

+0

Tôi biết, giống như bạn, rằng không có chuyển đổi. Tất cả những gì tôi muốn chỉ ra là đoạn mã bạn cung cấp không thể * chứng minh được *. Chuyển đổi ngầm định giữa các loại có liên quan xảy ra mọi lúc. Tôi không thể phàn nàn quá nhiều, tôi cũng không có bằng chứng nào cả. –

3

Trong trường hợp bạn muốn standardese, [dcl.typedef] bang rằng:

Một tên tuyên bố với typedef specifier trở thành một typedef tên. Trong phạm vi của việc kê khai, một typedef tên là cú pháp tương đương với một từ khóa và tên các loại liên quan đến việc nhận dạng trong cách được mô tả tại khoản 8. Một typedef tên do đó là một từ đồng nghĩa cho loại khác.A typedef-namekhông không giới thiệu loại mới theo cách khai báo lớp học (9.1) hoặc khai báo enum. [Ví dụ: sau khi

typedef int MILES, *KLICKSP; 

các công trình xây dựng

MILES distance; 
extern KLICKSP metricp; 

đều khai báo chính xác; loại distanceint và của metricp là “con trỏ đến int.” -end dụ]

Trong trường hợp của bạn, sau

typedef NodoQ *PtrNodoQ; 

Các loại PtrNodoQNode* là chính xác tương tự và có thể được sử dụng thay thế cho nhau từ đó trở đi. Các khai báo NodoQ* ppio;PtrNodoQ ppio; tương đương chính xác.

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