2008-11-26 35 views
7

Tôi vừa xem qua tùy chọn Visual C++ cho phép bạn buộc (các) tệp được bao gồm - điều này xảy ra khi tôi đang xem một số mã thiếu #include "StdAfx.h" trên mỗi. tệp cpp, nhưng thực sự đã làm như vậy thông qua tùy chọn này.Visual C++ 'Force Bao gồm' tùy chọn

Các tùy chọn có thể được tìm thấy trên nâng cao C/C++ Configuration Properties trang và tương đương với các tùy chọn biên dịch /FI.

Tùy chọn này có thể chứng minh thực sự hữu ích nhưng trước khi tôi vội vã và bắt đầu sử dụng nó, tôi nghĩ rằng tôi sẽ hỏi nếu có bất kỳ gotchas?

Trả lời

12

Tôi sẽ không khuyến khích/FI (MSDN nói nó được gọi là/FI.

Bạn có thể chắc chắn điều này sẽ gây ra nhiều thời gian gỡ lỗi cho ai đó muốn tìm ra nơi macro cụ thể đến từ, mặc dù không có #include dòng ở đầu tệp.

+1

Đồng ý. Tôi đã nói chính xác điều tương tự. :) –

+1

+1, cũng phải rõ ràng trong bao gồm bạn cần cho mã của bạn và không phụ thuộc vào người dùng bao gồm các tệp khác trước tệp .h của bạn, cũng như trong một số tệp được bao gồm gián tiếp bao gồm nội dung bạn phụ thuộc. –

+0

Tư vấn không phân biệt thường sai, và đó cũng là trường hợp ở đây. Có một kịch bản riêng biệt trong đó trình biên dịch chuyển đổi là hữu ích, hoặc thậm chí được yêu cầu: Biên dịch một thư viện ở dạng nguồn thành một ứng dụng được cấu hình để sử dụng các phần đầu được biên dịch trước. – IInspectable

15

Tôi sẽ nói ngược lại với câu lệnh trên nếu bạn đang sử dụng các tiêu đề được biên dịch trước. Nếu bạn sử dụng "stdafx.h" như tiêu đề biên dịch sẵn của bạn và có mã như thế này:

#include "afile.h" 
#include "stdafx.h" 

sau đó bạn sẽ được chi tiêu một tuổi cố gắng tìm ra lý do tại sao "afile.h" không được bao gồm. Khi sử dụng các tiêu đề được biên dịch trước, tất cả các phần tử bao gồm và #defines được bỏ qua đến "stdafx.h". Vì vậy, nếu bạn ép buộc bao gồm "stdafx.h" thì điều trên sẽ không bao giờ xảy ra và bạn sẽ nhận được một dự án sử dụng tùy chọn biên dịch sẵn một cách hiệu quả.

Đối với bình luận litb về việc tìm kiếm các macro, tốt IDE thường được có một tùy chọn để chuyển đến định nghĩa của một biểu tượng, cho dù đó là một #define, chức năng, lớp học vv

2

tôi muốn sát cánh cùng litb : đừng ép buộc bao gồm. Có mã rõ ràng giúp bạn dễ dàng biết được điều gì đang diễn ra đối với người dùng mới. Nó cũng làm cho nó dễ dàng hơn để biết những gì đang xảy ra nếu bạn cần phải chuyển mã vào một nền tảng mới.

Lưu ý rằng nếu mã sử dụng mẫu, Visual Studio thường không thể theo dõi chính xác các định nghĩa. Có lẽ năm 2010 sẽ tốt hơn, nhưng ngay cả VS 2008 cũng có vấn đề ở mặt trận này.

1

Lưu chức năng này khi có điều lạ xảy ra - như thể bạn muốn đưa tiêu đề vào tệp nguồn được tạo. Thậm chí sau đó có nhiều khả năng cách tốt hơn.

1

Tôi sẽ không sử dụng nó thường xuyên nhưng nó có công dụng của nó. Tôi đã sử dụng nó để thêm tiêu đề chặn một số cảnh báo cho tất cả các tệp cpp để tôi có thể bật/W4 hoặc/Tường cho dự án và không phải chỉnh sửa tất cả các tệp cpp để bao gồm tiêu đề chặn cảnh báo trước. Khi eveything đang hoạt động, tôi đã quay trở lại và chỉnh sửa tất cả các tệp cpp nhưng đối với một bằng chứng về khái niệm/FI là hữu ích. Tương tự như vậy, bạn có thể sử dụng nó để buộc phần đầu biên dịch trước vào tệp cpp trong một số cấu hình xây dựng nhưng không phải trong tất cả (trong trường hợp bạn muốn có cấu hình xây dựng mà DOESNT sử dụng các tiêu đề được biên dịch trước và đảm bảo rằng mỗi cpp chỉ bao gồm chính xác những gì nó cần). Tuy nhiên sử dụng #pragma hdrstop là, IMHO, một cách tốt hơn để đạt được điều này.

Tôi đã nói về tất cả điều này trên blog của mình tại đây: http://www.lenholgate.com/blog/2004/07/fi-stlport-precompiled-headers-warning-level-4-and-pragma-hdrstop.html chi tiết hơn một chút.

1

Lực lượng bao gồm cũng hữu ích cho các tệp nguồn được tạo tự động. Hệ thống của chúng tôi sử dụng một công cụ tạo nhiều tệp nguồn nhưng chúng không bao gồm tệp tiêu đề được biên dịch trước của chúng tôi. Với "lực lượng bao gồm" biên soạn các tập tin này bây giờ là nhanh hơn.

Tùy chọn, bạn có thể viết tập lệnh để chèn dòng #include vào các tệp đó sau khi tạo và trước khi biên dịch. Nhưng tại sao lại gặp rắc rối đó?

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