2012-07-09 14 views
11

Tôi đã chạy vào các tiêu đề được biên dịch trước ngày hôm nay lần đầu tiên .. trước khi thay đổi cuộc đời của tôi. Tôi không thể tin rằng biên dịch mã C++ của tôi có thể nhanh như vậy. Nó có ý nghĩa hoàn toàn ngay bây giờ ..Các phần đầu được biên dịch sẵn trong các tệp tiêu đề

Dù sao, có một điều gây nhầm lẫn cho tôi là từ những gì tôi đã đọc cho đến nay, các tiêu đề được biên dịch trước chỉ nên được thêm vào tệp nguồn (cpp?).

Trong Visual Studio, có một tùy chọn trong Thuộc tính dự án-> C/C++ -> Nâng cao thành "Force Include File". Tôi đặt tùy chọn trình biên dịch đó thành stdafx.h.

Sau khi thực hiện điều này .. Tôi không còn yêu cầu bao gồm tiêu đề tôi đã thêm vào stdafx.h, ngay cả bên trong tệp tiêu đề của tôi (tệp nguồn được cho là tự động bao gồm stdafx.h). Đây có phải là hành vi mong đợi không?

Tôi không thể tìm thấy một địa điểm rõ ràng trong sự khác biệt giữa tệp tiêu đề/nguồn.

Nếu nó .. tuyệt vời nhưng tôi sợ đó là một trong những điều VC++ cho phép bạn thoát khỏi nhưng sẽ phá vỡ trong GCC. Và vâng .. nó cần phải được cầm tay; ít nhất là giữa GCC và VC++.

+1

Vâng, nếu bạn muốn dự án của mình hoạt động trên gcc, bạn nên tránh xa tùy chọn "Buộc bao gồm tệp". Boilerplate là để tạo #include đầu tiên trong tệp mã nguồn của bạn tệp tiêu đề biên dịch trước. –

+2

@Hans, tính năng gcc tương đương sẽ sử dụng tùy chọn dòng lệnh '-include' để bao gồm * stdafx.h * ở đầu mỗi tệp. –

Trả lời

13

StdAfx.h thực sự chỉ nên được đưa vào tệp nguồn chứ không phải là tiêu đề. Tôi sẽ đề nghị bạn #include "StdAfx.h" đầu tiên trong mỗi cpp và không sử dụng tùy chọn "Force Include File". Đó là cách tôi làm điều đó với các dự án đa nền tảng của mình. Đối với hồ sơ, tôi không thực sự sử dụng các tiêu đề biên dịch sẵn trong GCC Tôi chỉ xây dựng nó bình thường và nó hoạt động tốt.

Đối với một số nền. Trình biên dịch chỉ xem xét các tệp nguồn (ví dụ, * .cpp, * .c, v.v.) và vì vậy khi biên dịch chúng, nó phải bao gồm mọi tiêu đề và biên dịch bất kỳ mã nào được tìm thấy trong các tiêu đề. Tùy chọn tiêu đề biên dịch sẵn cho phép biên dịch tất cả mã đó (ví dụ, mã include'd toàn cục trong StdAfx.h) một lần để bạn không phải thực hiện tất cả thời gian. Đó là những gì StdAfx.cpp dành cho. Trình biên dịch biên dịch StdAfx.cpp với tất cả các mã được bao gồm trong StdAfx.h một lần thay vì phải làm điều đó mỗi khi bạn xây dựng. Vì vậy, vì bạn bao gồm StdAfx.h trong mọi tệp nguồn làm mục đầu tiên, nên không bao gồm nó trong bất kỳ tiêu đề nào vì chúng sẽ được bao gồm SAU STdAfx.h và do đó sẽ có quyền truy cập vào tất cả các mã trong StdAfx.h. Ngoài ra, bạn có thể sử dụng các tiêu đề đó trong các dự án khác mà không phải lo lắng về việc có một StdAfx.h xung quanh hoặc bao gồm cả một dự án sai.

+0

Câu hỏi của tôi là VC++ tự động thêm các tiêu đề này vào tiêu đề? Tôi nhận được không có lỗi khi sử dụng các loại mà tôi đã không bao gồm (nhưng đang ở trong stdafx.h) .. rất lạ. – irwinb

+2

Không, tùy chọn bao gồm lực sẽ thêm tệp vào dòng đầu tiên của mọi tệp nguồn/cpp. Cách thức bao gồm công việc là nội dung của tệp được đưa vào được đặt vào tệp nguồn tại vị trí của #include. Với lực bao gồm các tùy chọn mà sẽ làm cho mỗi CPP tập tin có nội dung của StdAfx.h của bạn ở đầu trang, tiếp theo là nội dung của tất cả các tập tin tiêu đề của bạn và mã nguồn (trong bất cứ thứ tự nó có trong tập tin). Vì vậy, hiệu quả là, mọi thứ được xác định trong StdAfx.h của bạn sẽ có sẵn trong các tiêu đề của bạn, trong dự án đó. Trình biên dịch chỉ xem xét các tệp nguồn không phải là tiêu đề. – syplex

+0

Ồ tôi hiểu rồi. Điều đó có ý nghĩa hoàn hảo. Cảm ơn bạn đã giải thích điều đó. – irwinb

4

Có, đó là hành vi mong đợi. Dự án Properties-> C/C++ -> Advanced để "Force Bao gồm File" thiết lập điều khiển Visual C++ compiler option /FI:

Tùy chọn này có tác dụng tương tự như cách xác định các tập tin với đôi dấu ngoặc kép trong một chỉ thị #include vào ngày đầu tiên dòng của mỗi tệp nguồn

Vì vậy, nó giúp bạn không bao gồm stdafx.h theo cách thủ công.

Mặc dù, bạn có thể sử dụng các tiêu đề được biên dịch sẵn với GCC và các trình biên dịch khác Hành vi phím tắt của Visual C++ không thể di chuyển trên các trình biên dịch khác. Vì vậy, hãy kiểm tra How to handle stdafx.h in cross-platform code? nơi các ý tưởng cho giải pháp di động được thảo luận.

Ngắn câu chuyện ngắn, bao gồm stdafx.h thủ công trong tệp nguồn .cpp của bạn và bạn cũng nên sử dụng GCC (giả sử, bạn sẽ định cấu hình bản dựng cho GCC để sử dụng các tiêu đề được biên dịch trước).

+0

Quảng cáo cho cả tệp .h và .cpp? – irwinb

+0

@irwinb Để .cpp tệp. Đã cập nhật câu trả lời. – mloskot

+0

Nếu nó chỉ thêm vào tập tin .cpp, tại sao VC++ ok với tôi có giảm tốc của những loại trong các tập tin tiêu đề của tôi mà không bao gồm chúng? – irwinb

2

Không sử dụng cài đặt "Buộc bao gồm tệp" (/ FI) vì nó vi phạm Chỉnh sửa & Tiếp tục! (và MS dường như không muốn để khắc phục vấn đề này)

Xem https://connect.microsoft.com/VisualStudio/feedback/details/668339/vs-2010-sp1-c-edit-and-continue-fails-with-fi

https://connect.microsoft.com/VisualStudio/feedback/details/342441/visual-studio-2005-force-includes-breaks-edit-and-continue-with-pre-compiled-headers

#include "stdafx.h" chỉ nên được tìm thấy như dòng không bình luận đầu tiên trong các file nguồn của bạn, không có trong tệp tiêu đề.