Tôi không phải là chuyên gia về ngôn ngữ lập trình hướng đối tượng cấp thấp hơn và tôi đang viết một số mã C cho một dự án tại nơi làm việc. Tôi đang cố gắng tạo ra một số kiểu dữ liệu trừu tượng tốt để làm việc cùng, và Googling xung quanh khiến tôi nhận ra rằng mọi người sử dụng ADT dựa trên cấu trúc theo hai cách. Một số người xác định loại dữ liệu dưới dạng cấu trúc:Khi nào tôi nên gõ struct so với con trỏ để cấu trúc?
typedef struct adt {
//content here
} adt;
và hiển thị nó với thế giới trong tệp tiêu đề.
Khác định nghĩa một kiểu dữ liệu như một con trỏ để struct:
// In .c file:
typedef struct adt_s {
//content here
} adt_s, *adt;
// In .h file:
typedef struct adt_s *adt;
Tôi hiểu rằng phương pháp này cho phép bạn typedef một cấu trúc mà không cho thế giới bên ngoài bất kỳ kiến thức về những gì bên trong struct này, do đó các lập trình viên chỉ có thể các chức năng sử dụng được cung cấp trong cùng một tệp tiêu đề để hoạt động trên loại dữ liệu này.
Có một lý do nào khác để chọn cách khác không? Có một quy tắc chung "chung" cho khi xác định ADT là cấu trúc và khi nào chúng ta định nghĩa chúng như là con trỏ tới cấu trúc?
Đối với mục đích dễ đọc có lẽ nó tốt hơn để viết 'typedef struct S3_s * S3' thay vì 'typedef struct S3_s * S3', không có? – Eregrith
@Eregrith: nếu bạn đi theo ngữ nghĩa ngôn ngữ chính thức, 'typedef struct S3_s * S3' nói rằng người khai báo' * S3' có kiểu 'struct S3_s' và lớp lưu trữ' typedef', vì vậy hãy đặt dấu hoa thị với định danh thực sự là thành ngữ ; tuy nhiên, việc đặt dấu hoa thị với kiểu là phù hợp hơn với bao nhiêu (nhiều nhất?) mọi người nghĩ về các khai báo; theo như tôi đồng ý, cả hai phiên bản đều miễn là bạn nhất quán ... – Christoph
Tôi chỉ chọn khoảng cách đó cho tính nhất quán với OP, vì tôi có thể thấy lợi ích theo cách này. – Useless