6

Tôi đang cố gắng tìm hiểu cách xử lý nhiều nội dung, và vẫn giữ mã của tôi gọn gàng.Thu thập thông thường bao gồm trong một tệp duy nhất - thực hành tốt?

Tôi đang lập trình ứng dụng Qt và tôi đã đặt tệp thường được sử dụng (và điều đó không thay đổi) trong tệp có tên "Util.h".

Util.h

#pragma once 

#include <Core/IObserver.h> 
#include <Core/Math.h> 
#include <QAction> 
#include <QDockWidget.h> 
#include <QFileDialog> 
#include <QGraphicsBlurEffect> 
#include <QLabel.h> 
#include <QMainWindow.h> 
#include <QMenu.h> 
#include <QMessageBox.h> 
#include <QShortcut.h> 
#include <QSignalMapper> 
#include <QSound> 
#include <QString> 
#include <QTimer.h> 
#include <QTreeView> 
#include <QStandardItemModel> 


// Path to icons 
#define ICON_PATH            \ 
    "../../Assets/GUI/Icons/" 

này tôi sau đó bao gồm nó trong hầu hết các tập tin tiêu đề của tôi

#include "Util.h" 
#include "Manager_Docks.h" 
#include "Manager_Tools.h" 
#include "Manager_Console.h" 
#include "ui_MainWindow.h" 
... 
  • Có cách nào tốt hơn để làm việc đó?
  • Điều này có làm chậm thời gian biên dịch nhiều không?

Tôi cũng đang nghĩ đến việc chỉ bao gồm Util.h trong mỗi cpp chỉ, và có một riêng biệt Header_Util.h cho các tập tin tiêu đề, tìm kiếm một cái gì đó như thế này

Header_Util .h

#pragma once 

class IObserver; 
class QAction; 
class QDockWidget; 
class QFileDialog; 
... 
  • đây có phải là một giải pháp tốt hơn?
  • Ngoài ra, tôi biết rằng có một cái gì đó gọi là các tiêu đề được biên dịch trước, nhưng chưa bao giờ sử dụng bản thân mình. Đây có lẽ là một giải pháp cho vấn đề của tôi và một cái gì đó tôi nên xem xét? Tôi đang ở trên Windows sử dụng VS2012 nếu điều đó tạo ra bất kỳ sự khác biệt nào.
  • ... và tóm tắt tất cả các câu hỏi. Bạn sẽ làm gì ở chỗ tôi?
+0

Nó giúp khi bạn sử dụng các tiêu đề được biên dịch trước. VS2012 tận dụng lợi thế của nó. – Elazar

+0

Bạn có đặt các tiêu đề được biên dịch trước trong cả hai .h và .cpp hoặc cpp không? Làm thế nào bạn sẽ làm điều đó trong các tập tin tiêu đề sau đó? – Adelost

+0

Nó có thể khiến bạn phải xây dựng lại thường xuyên hơn. –

Trả lời

4

TL; DR: Nói chung, nó là tốt nhất để loại bỏ tiêu đề không cần thiết có thể nhìn thấy khi phát triển C++ hoặc C.

Có cách nào tốt hơn để làm việc đó?

Đây thường là ý tưởng rất tồi khi dự án của bạn không nhỏ. Hầu hết các nguồn sẽ không cần phải xem phần khai báo của hầu hết các tệp và đó là các đối tượng cấp cao. Ít nhất chia nó theo thể loại.

Điều này có làm chậm thời gian biên dịch nhiều không?

Nói chung, có. Ví dụ: Hầu hết các tệp nguồn của bạn cần biết về thư viện giao diện người dùng? Chắc là không.

Đây có phải là giải pháp tốt hơn không?

Có. Chi phí khai báo trước rất nhỏ.

Ngoài ra, tôi biết rằng có cái gì đó được gọi là các tiêu đề được biên dịch trước, nhưng chưa bao giờ sử dụng bản thân mình. Đây có lẽ là một giải pháp cho vấn đề của tôi và một cái gì đó tôi nên xem xét?

Đối với một số bản dựng, chúng có thể tiết kiệm rất nhiều thời gian. Đối với những người khác, họ chỉ có thể làm chậm mọi thứ. Nếu bạn chọn sử dụng chúng, sau đó đo thời gian xây dựng để xác nhận cái nào tốt hơn cho dự án của bạn và bao gồm bạn cần.

Thông thường, bạn tìm thấy tất cả nguồn của bạn không cần biết về thứ gì đó rất cao và lớn (ví dụ: thư viện GUI và lớp trừu tượng). Chỉ một phần các nguồn thông thường cần phải biết về các thư viện cấp cao hơn đó. Đây thường là điểm tốt để chia nhỏ mã nguồn của bạn thành các mục tiêu/thư viện nhỏ hơn.

... và tóm tắt tất cả các câu hỏi. Bạn sẽ làm gì ở chỗ tôi?

Tôi sẽ không nhồi nhét tất cả các thư viện/tiêu đề cấp cao đó vào tiêu đề cho tất cả các nguồn để xem. Thật là đau đớn để hoàn tác trong các mã lớn và có xu hướng tốn rất nhiều thời gian xây dựng trên đường đi. Các tiêu đề chứa các khai báo chuyển tiếp là tốt.

+1

Các tiêu đề được biên dịch trước đã trở thành một ứng biến lớn, giảm tổng thời gian biên dịch từ 70 xuống còn 18 giây. Thay đổi được thực hiện trong một tập tin tiêu đề được sử dụng để mất 20s để biên dịch lại bây giờ mất 2s. Tôi ngạc nhiên khi nói rằng ít nhất! Ước gì tôi đã nói về điều này sớm hơn. :) – Adelost

1

Điều bạn đang làm là phổ biến, mặc dù nó sẽ được đặt trong một tiêu đề được biên dịch trước.

Một tiêu đề được biên dịch trước (cùng với một precompiled.cpp) chỉ là một tiêu đề sẽ được biên dịch trước. Tệp obj từ trình biên dịch này sau đó có thể được đưa trực tiếp vào các tiêu đề khác. Điều này ngăn cản tất cả các tệp .cpp của bạn từ việc biên dịch các tệp tiêu đề phổ biến và các tệp cpp lặp đi lặp lại. Điều này tăng tốc độ biên dịch theo đơn đặt hàng của cường độ.

Thiết lập tiêu đề được biên dịch trước khá đơn giản và có một số tài nguyên trực tuyến để thực hiện việc này.

+0

Đang cố gắng xem xét nó ngay bây giờ ... bạn có đặt "stdafx.h" trong các tệp Header ... hay chỉ các tệp .cpp không? – Adelost

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