2012-02-12 43 views
18

Có một số trường hợp khi chúng tôi bao gồm tập tin cpp thay vì tập tin tiêu đề chuẩn (.h), ví dụ:Bao gồm cpp thay vì tiêu đề (.h)

#include "example.cpp" 

thay vì

#include "example.h" 

Dường như nó hoạt động nhưng điều này an toàn hay tôi nên tránh nó?

Còn thời gian biên soạn thì sao?

+0

Nó an toàn như bạn làm. Nó thường không cần thiết. Lập trình không phải là một cách mù quáng theo một số mặt hàng chở hàng, mà là về * hiểu * những gì bạn đang làm và đưa ra quyết định dựa trên sự hiểu biết và lý luận. –

+1

Lý do hợp lệ duy nhất tôi từng thấy để thực hiện việc này là tiết kiệm thời gian liên kết. [Unity Build được giải thích ở đây] (http://stackoverflow.com/questions/543697/include-all-cpp-files-into-a-single-compilation-unit). –

+0

@sysop: Như tôi đã nói: ** hiểu ** những gì bạn đang làm và hỏi trước tiên. Bao gồm được xử lý bởi * bộ tiền xử lý *, lâu trước khi bất kỳ việc biên dịch nào xảy ra. Hiểu bộ tiền xử lý và bạn sẽ biết khi nào thì nó sẽ bao gồm mọi thứ. –

Trả lời

19

Mã hóa lười. Sử dụng tệp tiêu đề. Có, họ có thể tăng thời gian biên dịch nhưng họ có nghĩa là bạn có thể dễ dàng triển khai lại các đoạn mã của bạn, hoặc tốt hơn, một nhà phát triển khác có thể bất cứ lúc nào. Tệp tiêu đề đóng vai trò mẫu cho mã số C/C++ của bạn sẽ thực hiện. Đó là một ý tưởng tồi để loại bỏ hoặc bỏ qua nó.

+0

Tôi luôn sử dụng .h, nhưng chúng tôi có khá nhiều tranh luận ở đây và đó là lý do tôi hỏi. – sysop

+2

@sysop - để công bằng, "Đó là mã hóa lười biếng" là một chút hyperbolic. Có những trường hợp mà nó thực sự có thể là điều đúng đắn để làm, nhưng trong trường hợp chung tôi sẽ cho rằng đó là hình thức nghèo nàn. – zellio

+8

Bao gồm các tệp '.h' thay vì tệp' .cpp' có thể ** tăng tốc ** thời gian biên dịch rất nhiều vì nó cho phép bạn thực hiện một phần biên dịch lại. – tom

1

Tôi đã sử dụng nó trước và không có vấn đề nhưng tôi không thể đảm bảo rằng điều này là an toàn. Đôi khi đây là lựa chọn duy nhất cho tôi vì vậy tôi đã sử dụng nó, nếu không tôi sẽ sử dụng tệp .h.

+0

Luôn có một tùy chọn khác là a.k.a. không bao giờ nói không bao giờ. – LihO

3

Có sử dụng hợp pháp cho #include "impl.cpp":

  1. thử nghiệm để truy cập vào tĩnh/etc biến

  2. quảng cáo hoc mẫu như thế này nếu cơ chế C++ mẫu chứng minh không đầy đủ (hiếm)

    #define MACRO (...)

    #include "impl.cpp" // uses MACRO

Lưu ý rằng #include "impl.cpp" có thể không an toàn khi cùng một tệp được bao gồm trong các đơn vị biên dịch riêng biệt sau này được liên kết với nhau.

7

Tôi đồng ý với SB của Kerrek.

Tôi đã làm điều này một lần. Tôi đã xây dựng một thư viện nén tuyệt vời, được sử dụng rộng rãi cần được xây dựng riêng cho hình ảnh 8 bit và cho hình ảnh 12 bit. Cách sạch nhất mà tôi có thể đưa ra để phù hợp với hệ thống xây dựng này là (oversimplifying một chút) để có hai tệp .cpp chính, một tập hợp #defines cho một bản dựng 8 bit, cái còn lại để xây dựng 12 bit. Các tệp .cpp chính sau đó #included các tệp nguồn của thư viện nén.

Bạn có thể không tuân thủ quy tắc chung nếu bạn hiểu quy tắc đủ tốt để biết lý do và nguyên nhân có thể không áp dụng trong trường hợp của bạn. (Nhưng những trường hợp này hiếm khi xảy ra.)

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