Tôi đang làm việc với một hệ thống nhúng và tôi kết thúc bằng một tấn các macro #define
HW giao tiếp HW. Tôi muốn đặt tất cả các tệp này vào một tệp riêng biệt (cho OOP-ness), nhưng tôi không biết cách tốt nhất để #include
đó. Tôi chỉ cần đặt tất cả chúng vào một tập tin .c, sau đó bao gồm điều đó? Có vẻ ngớ ngẩn để đặt chúng trong một tập tin .h.Tôi đặt tất cả các chức năng như #defines ở đâu vào C?
Trả lời
Tôi không thấy điều gì sai với tệp .h.
Vâng, đây là thực hành tiêu chuẩn. – caf
Vâng, quy tắc chung của ngón tay cái là các nguyên mẫu chức năng nằm trong các tệp .h và triển khai của chúng trong các tệp .c. Trong trường hợp này, tôi sẽ đưa các triển khai vào các tập tin .h - không bình thường nơi ai đó sẽ tìm kiếm chúng. – Tristan
@Tristan: điều gì là đúng đối với các hàm không nhất thiết đúng cho các macro; nó cũng phổ biến cho các hàm nội tuyến để nằm trong các tệp tiêu đề – Christoph
Những thứ này sẽ có trong các tệp .h
. Tùy chọn khác là tệp .c
và yêu cầu sử dụng #include
để bao gồm tệp .c
, điều này sẽ gây nhầm lẫn cho mọi người - cũng như gây nhầm lẫn cho tệp makefile của bạn, nếu sử dụng giả định tiêu chuẩn rằng mọi tệp .c
sẽ tương ứng trực tiếp với đã biên soạn .o
tệp.
Mẫu thông thường là .h
tệp dành cho những thứ được bao gồm ở những nơi khác (và đặc biệt là ở nhiều nơi khác) và tệp .c
dành cho những thứ được biên dịch một lần thành tệp đối tượng.
Như vậy, những điều sau đây thường đi vào .h
file:
- nguyên mẫu Function
- tờ khai liên tục
- biến toàn cầu
extern
tờ khai - Inline chức năng các định nghĩa
- Loại nghĩa
- và định nghĩa macro, chẳng hạn như những gì bạn đang yêu cầu trong khoảng.
Ngược lại, những điều sau đây thường đi vào .c
file:
- định nghĩa biến toàn cầu
- định nghĩa chức năng sẽ được biên dịch thành mã đối tượng và liên kết
Trường hợp của " định nghĩa hàm chỉ đi vào các tệp .c
"chỉ đơn giản là trường hợp thoái hóa khi bạn không có bất kỳ hàm nội dòng nào.
Trong C++, trong đó có nhiều hàm được định nghĩa ở dạng khuôn mẫu và do đó các định nghĩa cần được bao gồm bất cứ khi nào chúng được sử dụng, các định nghĩa này thường xuất hiện trong tệp .h
(hoặc .hpp
hoặc bất kỳ tệp nào). Vì vậy, loại điều này chắc chắn đã có tiền lệ.
Tôi không nhất thiết phải đề xuất điều này nhưng đã thấy nó trong một vài dự án được nhúng trong hơn 10 năm qua: bao gồm các hàm nội tuyến dưới dạng .inl.
Brooks phân tích trách nhiệm một cách độc đáo. Bạn có thể xem xét tách nội tuyến và định nghĩa vĩ mô từ nguyên mẫu chức năng bình thường và như vậy:
#include "prototypes.h"
#include "macros.inl"
int foo(void);
int bar(char);
mục tiêu cuối cùng của bạn là nhất quán: bất kỳ quyết định bố trí nên hỗ trợ những người thành công bạn.
Đặt chúng vào nơi bạn cần đến chúng.
Nếu bạn chỉ cần một tệp thì hãy đặt nó ở đầu tệp đó.
Nếu bạn cần nó cho nhiều tệp thì hãy đặt nó vào tệp tiêu đề.
- 1. Tôi nên đặt các chức năng linh tinh vào một dự án .NET ở đâu?
- 2. Tất cả các chức năng đơn giản đều ở đâu trong WebGL?
- 3. Các chức năng tiện ích ở đâu nên ở Django?
- 4. Chức năng ảo thuần túy nằm ở đâu trong C++?
- 5. Tôi đặt hàm XSL ở đâu trong tài liệu XSL?
- 6. Scrum - bạn làm tất cả những thứ 'khác' ở đâu?
- 7. Tôi có thể nhận mã bưu chính ở tất cả các quốc gia ở đâu?
- 8. Tất cả các mẫu email Magento ở đâu?
- 9. Các chức năng Symfony "toàn cầu" nên được đặt ở đâu?
- 10. Tôi có thể tìm danh sách tất cả các đặc điểm đặc biệt ở Scala ở đâu?
- 11. Tôi có thể tìm các bản triển khai gốc của các chức năng này ở đâu?
- 12. Tôi nên đặt các tệp cấu hình IPython ở đâu?
- 13. Thêm printf vào phần bắt đầu của tất cả các chức năng trong một tập tin
- 14. Tôi lấy danh sách tên Build.MODEL ở đâu cho tất cả các thiết bị Android?
- 15. Tôi có thể lấy danh sách tất cả các phần tử iOS ở đâu?
- 16. Tôi nên đặt scriptmanager ở đâu
- 17. Tôi lấy danh sách tất cả các chữ ký virus đã biết ở đâu?
- 18. Chức năng giống như Curl ở Dart
- 19. Tôi có thể tìm mã nguồn cho tất cả các thư viện chuẩn của C ở đâu?
- 20. Chức năng "chọn tất cả" và iCheck
- 21. Tôi đặt các phương thức chung vào ứng dụng MVC ở đâu
- 22. Các chức năng thành viên được lưu trữ cho một đối tượng ở đâu?
- 23. Tất cả các vị trí có thể có của các mục đăng ký UninstallString ở đâu?
- 24. Bạn đặt câu lệnh SQL vào các dự án C# ở đâu?
- 25. xóa tất cả các biến ngoại trừ chức năng
- 26. Tôi nên đặt plugin .vim ở đâu?
- 27. Tôi đặt "WSGIPassAuthorization On" ở đâu?
- 28. Chức năng gì và $ this-> getPriceHtml() ở đâu?
- 29. javascript thêm phương thức nguyên mẫu vào tất cả các chức năng?
- 30. SQL Server 2012 Web Management Studio - tất cả các tùy chọn ở đâu?
FWIW: Chúng được gọi là "macro", không phải là "chức năng". – dmckee
Tại sao nó có vẻ ngớ ngẩn để đặt tất cả chúng trong một tập tin .h? – FrustratedWithFormsDesigner
@dmckee: chúng tôi có thể tách sự khác biệt và gọi chúng là "macro giống như chức năng" thay vì "macro giống như đối tượng" - các thuật ngữ được sử dụng trong tiêu chuẩn. –