2010-03-11 28 views
8

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?

+2

FWIW: Chúng được gọi là "macro", không phải là "chức năng". – dmckee

+1

Tại sao nó có vẻ ngớ ngẩn để đặt tất cả chúng trong một tập tin .h? – FrustratedWithFormsDesigner

+0

@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. –

Trả lời

13

Tôi không thấy điều gì sai với tệp .h.

+1

Vâng, đây là thực hành tiêu chuẩn. – caf

+0

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

+3

@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

7

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ệ.

2

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.

2

Đặ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 đề.

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