Nói chung, đó là một thực tế không tốt.Vấn đề quan trọng là nó không chơi tốt với const
:
typedef type_t *TYPE;
extern void set_type(TYPE t);
void foo(const TYPE mytype) {
set_type(mytype); // Error expected, but in fact compiles
}
Để cho tác giả của foo()
để diễn tả những gì họ thực sự có nghĩa là, các thư viện cung cấp TYPE
cũng phải cung cấp CONST_TYPE
:
typedef const type_t *CONST_TYPE;
để foo()
có thể có chữ ký void foo(CONST_TYPE mytype)
và tại thời điểm này, chúng tôi đã rơi vào tình trạng bừa bãi.
Do đó một quy tắc của ngón tay cái:
Hãy typedefs của cấu trúc (đặc biệt là cấu trúc không đầy đủ), chứ không phải con trỏ đến những cấu trúc.
Nếu định nghĩa của các cấu trúc cơ bản không phải là để được công bố rộng rãi (mà thường là rất đáng khen ngợi), sau đó đóng gói cần được cung cấp bởi các struct là không đầy đủ, chứ không phải bởi typedefs bất tiện:
struct type_t;
typedef struct type_t type_t;
void set_type(type_t *);
int get_type_field(const type_t *);
Nguồn
2010-09-23 20:22:24
Confusions Confusions! –
Chỉ một trong những câu trả lời cho "Con trỏ Typedef là một ý tưởng hay?" ám chỉ đến sự tương tác vô dụng với 'const' - và câu trả lời đó được xếp hạng thấp. IMHO vấn đề 'const' là vấn đề quan trọng nhất với các loại typedefs, ... do đó không thực sự là một bản sao. –
@ John: Tôi không đồng ý với bạn về kết luận. Bạn đã lưu ý rằng câu trả lời được thêm vào lâu sau khi câu hỏi được hỏi đã không nhận được nhiều sự chú ý, nhưng các câu hỏi vẫn cơ bản giống nhau. – dmckee