Tôi có lẽ sẽ không bao giờ nói không bao giờ, nhưng các câu lệnh tạo dữ liệu và mã khi chúng được phân tích cú pháp không nên nằm trong tệp .h.
Macro, hàm và mẫu nội tuyến có thể trông giống như dữ liệu hoặc mã, nhưng chúng không tạo mã khi chúng được phân tích cú pháp, mà thay vào đó khi chúng được sử dụng. Các mục này thường cần được sử dụng trong nhiều .c hoặc .cpp, vì vậy chúng thuộc về .h.
Theo quan điểm của tôi, một tệp tiêu đề nên có giao diện thực tế tối thiểu với .c hoặc .cpp tương ứng. Giao diện có thể bao gồm #defines, class, typedef, định nghĩa cấu trúc, nguyên mẫu hàm và các định nghĩa bên ngoài ít được ưa thích hơn cho các biến toàn cục. Tuy nhiên, nếu một khai báo chỉ được sử dụng trong một tệp nguồn, thì có lẽ nên loại trừ nó khỏi .h và được chứa trong tệp nguồn thay thế.
Một số có thể không đồng ý, nhưng tiêu chí cá nhân của tôi đối với các tệp .h là chúng # bao gồm tất cả các tệp .h khác mà chúng cần để có thể biên dịch. Trong một số trường hợp, đây có thể là rất nhiều tệp, vì vậy chúng tôi có một số phương pháp hiệu quả để giảm sự phụ thuộc bên ngoài như khai báo chuyển tiếp đến các lớp cho phép chúng tôi sử dụng con trỏ tới các đối tượng của lớp mà không bao gồm những gì có thể là một cây bao gồm các tệp lớn.