2009-03-24 31 views
30

Tôi thấy rất nhiều mã bao gồm stdafx.h. Giả sử, tôi làm không phải muốn các tiêu đề được biên dịch trước. Và tôi sẽ bao gồm tất cả các tiêu đề hệ thống bắt buộc theo cách thủ công. Trong trường hợp đó là có bất kỳ lý do chính đáng nào khác mà tôi nên biết về nơi tôi yêu cầu stdafx.h?stdafx.h: Khi nào tôi cần?

+0

(đối với bất kỳ ai sử dụng tính năng này là tham chiếu) Nếu bạn đang sử dụng các tiêu đề được biên dịch sẵn, hãy truy cập thuộc tính của dự án, C/C++ và các tiêu đề được biên dịch sẵn và chọn tùy chọn không sử dụng chúng. – MirroredFate

+0

StdAfx.h dành cho người mới: http://www.cplusplus.com/articles/2z86b7Xj/ –

Trả lời

16

Nếu bạn không muốn sử dụng tiêu đề được biên dịch trước, thì không có điểm để sử dụng tệp bao gồm tiêu chuẩn - điều này sẽ làm chậm bản dựng cho mọi tệp bao gồm và khiến chúng bao gồm thêm nội dung mà chúng không nhu cầu. Loại bỏ nó và chỉ bao gồm các tiêu đề mà họ cần.

2

Thậm chí không có tiêu đề được biên dịch trước stdafx.h có thể tiện dụng vì nó nhóm tiêu đề bao gồm và định nghĩa chung cho tất cả các tệp.

Tất nhiên, bạn có thể chọn lặp lại tất cả các định nghĩa này trong mọi tệp. stdafx.h là không cần thiết.

+0

Thực hành không tốt - bạn phải luôn liệt kê rõ ràng các tiêu đề bạn cần để bạn có thể kiểm tra phụ thuộc của mô-đun. – snemarch

+0

stdafx thường bao gồm các định nghĩa nền tảng cụ thể phổ biến cho tất cả các tệp. Đó là "phụ thuộc" của mọi tệp. Bạn sử dụng nó để không lặp lại các định nghĩa trong mỗi tập tin. Đây là một thực hành tốt, bởi vì bạn chỉ làm điều đó ở một nơi. – kgiannakakis

+0

Nó không phải là một phụ thuộc của mỗi tập tin, trừ khi mỗi tập tin thực sự yêu cầu mọi tiêu đề trong stdafx. Trong thực tế, điều này hiếm khi xảy ra (IME). Sử dụng nó theo cách này là lười biếng tốt nhất, thực hành xấu tại tồi tệ nhất – Patrick

2

stdafx.h chỉ là một tệp tiêu đề khác. Nếu bạn ngã bạn không cần nó cảm thấy tự do để không bao gồm nó và loại bỏ nó khỏi dự án.

Tuy nhiên, có một tệp như stdafx.h chính xác cho các tiêu đề được biên dịch trước hoạt động và không bao gồm tất cả nội dung theo cách thủ công trong mỗi tệp nguồn.

1

Như những người khác đã đề cập: nếu bạn không cần tiêu đề biên dịch sẵn, bạn không thực sự cần stdafx.h. Và sử dụng nó chỉ để nhóm chung bao gồm thực tế là khá xấu, thực sự. Trong thực tế, ngay cả khi sử dụng các tiêu đề biên dịch sẵn, thực hành tốt là bao gồm các tiêu đề mà quy trình của bạn thực sự cần sau stdafx.h (hoặc precompiled.h hoặc bất kỳ thứ gì bạn muốn gọi) - cùng với ma thuật #ifdef trong biên dịch trước của bạn tiêu đề để tắt việc sử dụng PCH.

Tại sao? Để kiểm tra phụ thuộc vào mô-đun của bạn. Có thể vô hiệu hóa PCH của bạn cho phép bạn nắm bắt xem bạn có bao gồm các mô-đun cần thiết hay không, và sau đó bạn có thể viết một công cụ để kiểm tra các phụ thuộc của mô-đun bằng cách phân tích cú pháp tệp .cpp và .h của bạn (không bao gồm tiêu đề PCH).

+1

Vâng viết một trình phân tích cú pháp C++ là một sự tăng trưởng lớn về thời gian ......... – Virus721

2

Bạn có thể sử dụng các tiêu đề được biên dịch trước (đó là một điều tốt) mà không cần sử dụng stdafx.h (tôi cũng dùng nó). Tôi đã chỉ có quyền truy cập vào VC + + 6.0 nhưng trong đó đi đến Cài đặt dự án | C/C++ | Headompiled Headers và chọn "tự động sử dụng tiêu đề biên dịch sẵn" nhưng để trống "biên dịch thông qua" hộp.

0

Tôi biết đây là một chủ đề cũ, nhưng tôi nghĩ tôi sẽ chuyển ý kiến ​​của mình cho độc giả. Tôi tìm thấy điều này vào năm 2017, vì vậy tôi chắc chắn tôi không phải là người duy nhất ở đây.

Có một lợi thế khi sử dụng các tiêu đề được biên dịch trước, có thể bị người khác bỏ qua vì họ đã sử dụng thực hành của họ trong nhiều năm. Tiêu chuẩn C++ đã phát triển rất nhiều. Thay vì bao gồm vector trong 20 tập tin mà bạn có thể cần và và hoặc bất cứ điều gì, bạn sử dụng một tập tin PCH và trình biên dịch phải làm việc ít hơn, và làm cho khuôn mặt hạnh phúc cho tất cả mọi người. Ngoài ra, bạn có thể đặt các macro phổ biến của mình trong đó, chẳng hạn như VERIFY và ASSERT và các đối tượng lớp thông minh. Không đặt tiêu đề lớp của bạn ở đó, nó sẽ không có ý nghĩa cho rằng, thay vì thư viện chuẩn hoặc một cái gì đó bạn sẽ cần phải sử dụng trên toàn cầu ở rất nhiều nơi như các macro tôi đã đề cập.

về cơ bản nhận ra điều này, bằng cách bao gồm tiêu đề bạn cần trong mọi tệp bạn cần, chẳng hạn như iostream, chuỗi và vectơ, bạn đang biên dịch hiệu quả mỗi lần như một nội tuyến cho tệp. Bao gồm tiêu đề "Biên dịch trước", chỉ cần đặt tên cho một chiếc chuông ở đó.

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