2011-08-03 31 views
5

Tôi đã thấy tiêu đề bao gồm kiểu như thế này, trong đó tệp tiêu đề không bao gồm các tệp tiêu đề khác và tệp * .cpp tương ứng phải bao gồm tất cả các phụ thuộc (và bao gồm chúng theo thứ tự đúng). Dường như có thể là trong những ngày tốt đẹp cũ mà điều này sẽ làm cho việc xây dựng phụ thuộc theo dõi dễ dàng hơn (nhưng tôi chỉ đoán). Có một lý do tốt cho nó ngày nay?Bất kỳ lý do nào tốt cho tệp tiêu đề C++ không bao gồm bất kỳ tệp tiêu đề nào khác?

File "Bh":

#ifndef _B_h_ 
#define _B_h_ 

// Note we do not #include "A.h" that contains class A declaration. 

class B 
{ 
public: 
    A a; // An A object. 
}; 
#endif // _B_h_ 

File "B.cpp":

#include "A.h" // Must include this before B.h, otherwise class A not defined in B.h 
#include "B.h" 

... 
+1

Bạn có thể chỉnh sửa tiêu đề câu hỏi của riêng mình nếu bạn muốn nó có tên như vậy. –

+0

Tôi nghi ngờ rằng bạn đã nhìn thấy * rằng * ví dụ trong cuộc sống thực, vì nó không biên dịch. Bạn phải có quyền truy cập vào loại hoàn chỉnh của từng đối tượng thành viên. –

+2

Mong muốn được cấp. :) –

Trả lời

4

Có vẻ như bất cứ ai đã viết mã đó đều hiểu sai đề xuất chung về việc giảm số lượng tiêu đề được bao gồm.Bạn nên xóa không cần thiết#include <> chỉ thị với hy vọng tăng tốc biên dịch. Thật vậy, đối với các dự án lớn, nó có thể đẩy nhanh quá trình biên dịch một cách đáng kể bằng cách:

  1. giảm số lượng tệp tiêu đề mà trình biên dịch cần mở để biên dịch bất kỳ tệp nguồn nào;
  2. giảm số lượng tệp nguồn cần được biên dịch lại sau khi thay đổi tiêu đề.

Nói chung, mọi người sẽ khuyên (nó được trên tiêu chuẩn mã hóa cho tất cả các dự án tôi đã làm việc trên) sử dụng tờ khai phía trước cho các lớp trừ lớp được định nghĩa trong tiêu đề liên quan là:

  1. sử dụng như một lớp cơ sở;
  2. được sử dụng làm thành viên dữ liệu;
  3. có thông số chính thức không đầy đủ (ví dụ: các thùng chứa thư viện chuẩn được phép có đối số mẫu bổ sung miễn là chúng có mặc định, vì vậy không chuẩn để chuyển tiếp khai báo chúng).

Trong trường hợp 1 và 2, #include <> chỉ phải xuất hiện trước khi định nghĩa lớp trong tất cả file nguồn phụ thuộc và các tiêu đề. Về cơ bản, nó chỉ di chuyển các chỉ thị #include <> từ đầu trang vào mỗi phụ thuộc của nó. Nó tạo ra nhiều mã hơn và làm như vậy mà không có lợi ích (ví dụ: thời gian biên dịch, vv sẽ giống nhau). Vì lý do này, đề xuất này cũng đi kèm với một mục nhập khác trong tiêu chuẩn mã hóa: mỗi tệp tiêu đề phải biên dịch "độc lập" (ví dụ: được bao gồm trong dòng đầu tiên của tệp nguồn).

8

Yeah, đó sẽ là thực tế xấu, bởi vì nếu có ai đó bị theo thứ tự sai họ sẽ nhận lỗi rằng họ có thể hoặc không thể tìm ra. Nếu tất cả các tệp tiêu đề đều có bộ bảo vệ, thì một tiêu đề bao gồm tất cả các tiêu đề khác mà nó cần sẽ không phải là vấn đề, đó là cách thực hiện.

+1

+1. Tôi nghĩ rằng tôi đã gặp loại vấn đề này tại một số thời điểm khi đưa vào một trong các tệp tiêu đề của Window. Tài liệu cho biết một cái gì đó như "khi bạn bao gồm X bạn cũng nên bao gồm Y". Suy nghĩ của tôi là "tốt, nếu X yêu cầu Y, thì tại sao X lại không bao gồm Y?". – MRAB

+0

@MRAB Tôi cũng nhớ điều gì đó tương tự, nhưng tôi không thể nhớ tiêu đề đó là gì. –

+1

'' phải được bao gồm trước ' ', hoặc khác' ' bao gồm '', không tương thích (và không được chấp nhận?). –

2

Hôm nay có lý do chính đáng cho nó không?

Không, không thực sự. Mọi người làm đủ mọi thứ mà "sẽ làm việc" hoặc vì họ không biết gì hơn, không quan tâm hoặc có những điều quan trọng hơn phải lo lắng. Nó xảy ra khi ngôn ngữ của bạn dựa trên một bộ tiền xử lý thay vì có một hệ thống nhập-mô-đun thực.

Tôi sẽ nói cách tốt nhất là đảm bảo rằng người # bao gồm công cụ của bạn không bao giờ phải lo lắng về thứ tự bao gồm hoặc các điều kiện tiên quyết bị ẩn. Trừ khi tất nhiên, bàn tay của bạn bị ép buộc bởi một số thủ thuật macro ngu ngốc của bên thứ ba.

4

Đó thực sự là một thực tế không tốt. Hãy để trình biên dịch tìm ra đúng thứ tự - ít bị lỗi hơn. Tiêu đề phải biên dịch như thể chúng được bao gồm trên riêng của chúng - tức là, nếu bạn có TU bao gồm chỉ #include "B.h".

+0

Trình biên dịch không thể tìm ra thứ tự đúng. Có _không phải là một thứ tự đúng_. –

+1

Moreso, vì không có * cách nào mà bạn có thể sử dụng 'B.h' * mà không có * cũng bao gồm' A.h', nó chỉ là hợp lý mà 'A.'' nên được đưa vào bên trong' B.h'. Bạn sẽ có thể nói, "Tôi muốn lớp' B' ", và đạt được điều này chỉ bằng cách bao gồm' B.h' trong mọi trường hợp. –

2

Có, tôi khuyên bạn nên #including 'bất kỳ sự phụ thuộc nào của INTERFACE trong bất kỳ tiêu đề nào.

Trong trường hợp này, có: Tôi sẽ # bao gồm "A" (vì giao diện của B phụ thuộc vào A).

Nếu không, nếu triển khai sử dụng "A" (nhưng tiêu đề không), tôi sẽ chỉ #bao gồm A trong .cpp (vì nó không phải là một phần của giao diện).

Trong trường hợp KHÔNG, tôi muốn thứ tự của các tiêu đề quan trọng, nếu có thể tránh được. Thông thường, thứ tự tiêu đề KHÔNG NÊN.

IMHO ...

PS: Càng nhiều càng tốt Bjarne Stroustrup muốn nếu không, tiền xử lý và tiền xử lý macro là vẫn còn rất nhiều với chúng tôi. Chắc chắn trong C-land, và chắc chắn chỉ là về bất kỳ Microsoft API. Nó chỉ là hình thức tốt để tôn trọng thực tế đó.

2

Tôi sẽ xem xét kiểu xấu này. Nó sẽ dẫn đến khó khăn để hiểu lỗi.

Lý do bạn có thể làm điều đó là tránh biên dịch lại nhiều mã mỗi lần bạn thực hiện thay đổi đối với một tệp tiêu đề duy nhất. Nếu bạn thấy mình trong tình huống này mặc dù, bạn có thể có một vấn đề thiết kế.

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