2011-09-07 35 views
7

C++ vẫn là ngôn ngữ phát triển và các tính năng mới đang được thêm vào trong nhiều năm. Một trong những tính năng mà tôi bỏ lỡ trong C++ là một khái niệm mô-đun thích hợp: cách tiếp cận hiện tại bằng cách sử dụng các tệp tiêu đề (nơi bạn sử dụng điều kiện #define để đảm bảo rằng tiêu đề không được bao gồm hai lần) dường như chắc chắn không thỏa mãn với tôi. Ví dụ, trong dự án của tôi, chúng tôi có vấn đề rằng chúng tôi có quá nhiều "#include" trong nhiều tệp nguồn, làm cho thời gian biên dịch không cần thiết lâu: mất 45 phút để xây dựng sản phẩm của chúng tôi, sử dụng Incredibuild, tức là sử dụng ít nhất 10 lõi song song. Do đó, chúng tôi phải dành rất nhiều thời gian để dọn dẹp các tệp theo cách thủ công, tức là việc xóa bao gồm để kiểm tra xem chúng có thực sự cần thiết hay không.Mô-đun khái niệm cho C++

Tôi nghĩ rằng nó sẽ rất hữu ích để có một khái niệm mô-đun mà làm cho nó có thể để

  1. tách rõ giao diện từ việc thực hiện một mô-đun;
  2. biên dịch giao diện và phần thân của mô-đun riêng biệt (hiện tại các tệp .h được biên dịch lặp đi lặp lại mỗi khi chúng được bao gồm trong các tệp khác): một công cụ có thể đọc giao diện đã biên dịch và cho biết loại, chức năng, lớp nào xuất khẩu;
  3. viết các công cụ để tự động sắp xếp lại hàng nhập dễ dàng hơn (ví dụ: với Java/Eclipse, có thể sắp xếp lại tất cả các tệp nhập tự động).

Bạn có nghĩ rằng có thể xác định khái niệm mô-đun như vậy và tích hợp nó vào C++ hoặc quá phức tạp không? Bạn có biết bất kỳ nỗ lực nào theo hướng này không?

EDIT

Cảm ơn đã gợi ý về tiêu đề biên dịch sẵn. Tôi sẽ thử nó nếu có thể (Chúng tôi sử dụng Visual Studio 2008). Có thể chúng tôi đang sử dụng các tệp tiêu đề theo cách sai (?) Chúng tôi sử dụng một tệp tiêu đề cho mỗi lớp. Sau đó, chúng tôi có một tập tin cpp với việc thực hiện lớp. Thường thì chúng tôi kết thúc với các tệp cpp bao gồm 30, 40 tệp tiêu đề. Khi chúng ta thay đổi tệp cpp, một số bao gồm không cần nữa, nhưng rất khó để tìm ra cái nào. Điều này một phần liên quan đến thực tế là các tệp tiêu đề bao gồm các tệp tiêu đề khác.

Chúng tôi dành quá nhiều thời gian sắp xếp lại hàng nhập và có vẻ như không tồn tại một công cụ có thể thực hiện điều này tự động. Nó sẽ giúp chúng ta tiết kiệm rất nhiều thời gian.

+0

Tôi muốn thấy công cụ tìm kiếm bao gồm cây bao gồm không chứa bất kỳ biểu tượng được sử dụng nào. Nó thực sự là khó khăn để giữ bao gồm sạch sẽ khi thay đổi trong các nguồn được thực hiện. – Salw

+1

Tôi không chắc câu đầu tiên của bạn là sự thật. Tiêu chuẩn C++ 11 đã được hoàn thành một thời gian dài trước đây, được chấp nhận một thời gian ngắn trước đây và được xuất bản tuần trước; Tôi nghi ngờ bất cứ ai là thêm các tính năng cho nó vào thời điểm này. –

+0

@Kerrek SB: Tôi đã thay đổi văn bản xóa tham chiếu đến C++ 0x. Cám ơn vì sự gợi ý. – Giorgio

Trả lời

10

C++ vẫn là ngôn ngữ phát triển và các tính năng mới đang được thêm vào nó như là một phần của phát triển C++ 0x.

Tiêu chuẩn C++ 11 has already been approvedpublished, vì vậy sẽ không có thêm tính năng nào được thêm vào đó. Không ít nhất vài năm nữa.

Một tính năng mà tôi bỏ lỡ nặng trong C++ là một mô-đun khái niệm thích hợp: các cách tiếp cận sử dụng tập tin tiêu đề hiện tại (nơi bạn sử dụng một điều kiện #define để đảm bảo rằng các tiêu đề không được bao gồm hai lần) dường như chắc chắn gaëp khoù khaên với tôi.

Một số trình biên dịch hỗ trợ #pragma once để tránh phải viết các bộ bảo vệ kèm theo, nhưng không chuẩn theo như tôi biết. Có những tình huống mà bạn không muốn bao gồm nhân viên bảo vệ; Boost.Preprocessor là một ví dụ về thư viện với một số tiêu đề cố ý không bao gồm các vệ sĩ.

Ví dụ, trong dự án của tôi, chúng tôi có vấn đề mà chúng ta có quá nhiều "#include" 's trong nhiều file nguồn, làm cho thời gian biên dịch cách không cần thiết dài: phải mất 45 phút để xây dựng sản phẩm của chúng tôi, sử dụng Incredibuild, tức là sử dụng ít nhất 10 lõi song song. Do đó, chúng tôi phải mất rất nhiều thời gian để xóa các tệp theo cách thủ công, tức là xóa bao gồm để kiểm tra xem chúng có thực sự cần thiết hay không.

Stroustrup has an FAQ entry on compile-time slowness. Đồng thời đọc trên GotW article #7 về việc bao gồm các tệp tiêu đề. Rất có khả năng bạn đang bao gồm nhiều tệp hơn mức cần thiết. Ví dụ, bạn có thể có được với tờ khai về phía trước. Nếu bạn có các tệp tiêu đề lớn, bạn có thể thử tách chúng ra để các nguồn của bạn chỉ bao gồm các khai báo bạn thực sự cần. Nó có thể chỉ là một vấn đề của cấu trúc tập tin của bạn không được thuận lợi để biên dịch nhanh.

1. phân biệt rõ ràng giao diện từ việc triển khai mô-đun;

Chúng tôi có the PIMPL idiom (còn được gọi là tường lửa biên dịch) cho việc này. Và thậm chí không có nó, tôi không gặp khó khăn gì khi triển khai tệp .cpp và giao diện trong tệp .h (mặc dù nó không phải là giao diện "thuần túy").

2.compile giao diện và cơ thể của một module riêng (hiện file .h được biên dịch một lần nữa và một lần nữa mỗi lần họ bao gồm trong các tập tin khác): một công cụ sau đó có thể đọc được biên soạn giao diện và cho biết loại, hàm, lớp mà nó xuất;

Hỗ trợ một số trình biên dịch precompiled header files mà bạn có thể tận dụng.

3. ghi công cụ để tự động sắp xếp lại hàng nhập dễ dàng hơn.

Tôi không hiểu ý bạn là gì.

Bạn có nghĩ rằng có thể xác định khái niệm mô-đun như vậy và tích hợp nó vào C++ hoặc quá phức tạp không? Bạn có biết về bất kỳ nỗ lực nào của theo hướng này không?

Tin hay không, có a proposal để thêm khái niệm mô-đun vào C++, nhưng chưa được chấp nhận vào C++ 11 do hạn chế về thời gian (họ đang làm việc và xem xét các đề xuất khác như rvalue) tài liệu tham khảo, theo ý kiến ​​của tôi, quan trọng hơn nhiều). Nó có thể được bao gồm trong phiên bản tiếp theo hoặc cập nhật tiêu chuẩn C++.

+2

Tôi chắc chắn sẽ cung cấp cho các tiêu đề được biên dịch trước một shot. Nếu bạn có một hệ thống xây dựng gia tăng bình thường (thay vì, nói, tổng số bản dựng hàng đêm), thì phần đầu trang dài là phần lớn thời gian biên dịch và PCH có thể * thực sự * cắt giảm. –

+0

Theo như tôi biết rất khó để viết một công cụ mà sắp xếp lại nhập khẩu trong một tập tin C++ tự động, và điều này đã làm với cơ chế bao gồm C++. Tôi đã tìm thấy một số cuộc thảo luận trên trang web Eclipse/C++ về điều này. Tôi có thể khai thác liên kết, nếu nó có thể được quan tâm. – Giorgio

+0

Cảm ơn bạn đã liên kết đến đề xuất. – Giorgio

0

Đó không phải là cách C++ được thiết kế để hoạt động. Bạn có thể có thể làm điều đó nếu bạn poked và prodded linker đủ để đọc một tập tin chỉ mục thay vì reparsing tiêu đề. Tuy nhiên, trình biên dịch của bạn chỉ nên biên dịch các tệp đã thay đổi hoặc có các phụ thuộc đã thay đổi. Và bên cạnh đó, các tiêu đề không thực sự được biên dịch thành mã có ý nghĩa (trừ khi chúng có triển khai trong chúng, điều này đúng trong một số trường hợp). Chúng chỉ là một lưu ý cho trình biên dịch mà mã thông báo sẽ được tìm thấy sau này khi liên kết.

Câu trả lời ngắn gọn: Không, bạn không nên cố gắng triển khai một số hệ thống 'mô-đun' pha chế tại nhà. Tôi thực sự nghi ngờ tập tin tiêu đề là những gì đang dùng mãi mãi, trừ khi bạn đang sử dụng chúng không chính xác.

Chỉnh sửa: Khi ai đó chỉ ra, tôi đã bỏ qua các tệp tiêu đề có thể thực sự có thứ gì đó để biên dịch, thường là trường hợp trong các thư viện lớn hoặc bất kỳ thứ gì sử dụng nhiều mẫu. Như vậy, tôi đã sai lầm trên các tập tin "thực sự nghi ngờ tiêu đề là những gì đang dùng mãi mãi" tuyên bố.

+0

Tôi có một chương trình ngắn để tạo PNG với Boost.GIL. Phải mất 10 giây gây sốc để biên dịch. Biên dịch trước các tiêu đề (~ 60MB pch file) cắt giảm xuống một phần nhỏ của một giây. –

+0

Chà ... Có vẻ bây giờ là lúc tôi đưa chân vào miệng. Tôi đoán các tiêu đề thực sự có thể tăng thêm nhiều thời gian hơn tôi tưởng. (Đặc biệt là tiêu đề mẫu dày.) – Corbin

+1

Đặc biệt là những tiêu đề Boost pesky! :-) –

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