2011-08-26 70 views
11

Cách thích hợp cách nào để sử dụng stdafx.h, về cách tách phụ thuộc?Làm thế nào để sử dụng stdafx.h đúng cách?

Nếu tôi đặt mọi thứ trong đó, sau đó biên dịch của tôi cực kỳ nhanh chóng, và tất cả những gì cần phải nói trong bất kỳ tập tin là

#include "stdafx.h" 

hãy cẩn thận với rằng:

  1. tôi không còn biết tệp nào phụ thuộc vào tiêu đề nào.
  2. Nó làm giảm mô đun, làm cho mã của tôi ít sử dụng lại được.
  3. Tôi không còn có thể tách riêng C #include s khỏi những cái C++ (ví dụ: cstring so với string.h) mà không bị đau đớn nhiều. (Nói trong đó, điều này thậm chí còn quan trọng?)

Nếu tôi đặt trong đó, tôi có thể sắp xếp mọi thứ tốt - nhưng sau đó biên dịch của tôi chậm lại đáng kể.

Nếu tôi đặt tất cả mọi thứ trong đó và cũng bao gồm tất cả các tiêu đề trong các tập tin cá nhân của tôi, sau đó tôi nhận được tốt nhất của cả hai thế giới, với sự báo trước rằng bây giờ tôi phải theo dõi các vấn đề đồng bộ hóa.

Có giải pháp nổi tiếng/được chấp nhận tốt cho vấn đề này không?

Trả lời

13

Bạn không nên đặt các tệp tiêu đề của riêng mình trong stdafx.h vì mã của bạn có thể thay đổi và sẽ làm cho toàn bộ chương trình của bạn biên dịch lại.

Tôi thường đặt tiêu đề chuẩn và các thư viện khác trong đó, chẳng hạn như tất cả tăng bao gồm.

+0

Đồng ý. Đặt mọi thứ vào các phần đầu được biên dịch trước mà bạn sẽ không được chạm vào trong phạm vi của dự án đó. –

+0

Tôi không chắc chắn điều này có liên quan như thế nào. Tôi * vẫn * sẽ không biết tệp nguồn nào của tôi phụ thuộc vào tiêu đề nào (tôi có thực sự cần '#include 'gián tiếp trong mỗi tệp không?), Ngay cả khi chúng là tiêu đề hệ thống. Và vì vậy nó sẽ * vẫn * không phải là mô-đun. – Mehrdad

+3

@Mehrdad, đó là một trong những thỏa hiệp của việc có một tiêu đề biên dịch trước. – Marlon

4

Khi sử dụng các tiêu đề được biên dịch trước, bạn nên đảm bảo dự án của bạn biên dịch hoàn toàn ngay cả khi không có PCH (vì vậy hãy coi nó là tối ưu hóa, chứ không phải thay thế cho mỗi TU). Bên cạnh đó, đừng đặt mọi thứ vào đó (và quan trọng hơn, đừng bao giờ đặt tiêu đề từ dự án của riêng bạn - PCH chỉ nên chứa những phần không thay đổi hoặc thay đổi rất hiếm khi - thư viện hệ thống, phụ thuộc bên ngoài), nhưng thay vì cố gắng giữ những thứ được sử dụng nhiều nhất/lớn nhất được biên dịch trước.

1

Cá nhân, tôi muốn có trình biên dịch chậm hơn không có ý tưởng (khả năng hiển thị) cách phụ thuộc. Tuy nhiên, có giới hạn cho tất cả mọi thứ.

Vì mỗi dự án đều có tệp tiêu đề được biên dịch trước của riêng mình, vì vậy tôi chỉ cần đặt chung chung vào đó. Nói rằng nếu một dự án sử dụng một số tiêu đề tăng lên, chúng sẽ phù hợp tốt vì chúng sẽ được toàn bộ dự án sử dụng và bạn không thay đổi chúng. Do đó, đặt hiếm khi/không bao giờ thay đổi tiêu đề trong các tiêu đề được biên dịch trước như hệ thống hoặc nội dung của bên thứ ba.

Để có tốc độ biên dịch, tôi muốn dựa vào càng nhiều càng tốt để chuyển tiếp mọi thứ, chia thành các thư viện nhỏ hơn và thử xem mọi thứ có thể được sắp xếp theo cách mã không dễ ảnh hưởng đến việc biên dịch lại nhiều mã.

1

Trình biên dịch Yor có thể có cờ "hiển thị bao gồm". Bật tính năng này và tìm kiếm các hệ thống phân cấp bao gồm lồng nhau được lặp lại nhiều lần. Hãy xem xét bao gồm một trong những tập tin bao gồm nông nhất để tiêu đề của bạn cho mỗi cây sâu như vậy.

0

Có điều kiện bao gồm PCH, sau đó xác định điều gì đó như "#define _PRE_COMPILE_" Bằng cách này, các tiêu đề gốc vẫn hiển thị và mã là mô đun nếu bạn cần. Ví dụ về điều này sẽ bao gồm

#ifdef _PRE_COMPILE_ 
#include "stdafx.h" 
#elif 
#include <iostream> 
#include <cstring> 
#endif 

Bao gồm điều này ở đầu mỗi tệp nguồn.

+0

Có một '# ifdef' trước khi' #include "stdafx.h" 'không hoạt động do cách triển khai PCH của Microsoft hoạt động. –

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