2012-11-21 18 views
15

Xuất phát từ MFC, tôi xử lý qDebug() giống như TRACE(), giả sử rằng nó bị loại bỏ khỏi bản phát hành do bộ tiền xử lý (trong MFC nó được thực hiện bằng cách sử dụng #define TRACE 1 ? (void*) 0 : AfxTrace).Tại sao qDebug hoạt động trong bản dựng?

Tôi ngạc nhiên, tuy nhiên, qDebug() cũng được thực hiện trong Bản dựng bản phát hành. Làm cách nào để thay đổi điều này? Và ngoài ra, tại sao lại như vậy, lý do của các nhà phát triển Qt đằng sau quyết định này là gì?

+0

các liên kết hữu ích: http://qt-project.org/forums/viewthread/25512 và http://supportforums.blackberry.com/t5/Native-Development/Dealing-with-qDebug-in-release-candidate/ td-p/2078713 – x29a

Trả lời

22

qDebug cũng được kiểm soát tiền xử lý nhưng có macro đặc biệt riêng, QT_NO_DEBUG_OUTPUT. Nếu bạn thêm điều đó vào Bản phát hành bản phát hành của mình, nó sẽ bị xóa.

+0

Vậy tại sao nó không được đặt theo mặc định? Phải có lý do họ quyết định về điều đó. – sashoalm

+0

@sashoalm Đoán của tôi là [mọi người không phải lúc nào cũng cẩn thận để phân biệt stdin khỏi stdout] (xem http://stackoverflow.com/a/3886128/1858225) (xem nhận xét về câu trả lời đó, cũng như câu trả lời của tôi bên dưới) nó; câu trả lời ban đầu chỉ bao gồm khối mã đầu tiên), và sẽ là hành động không tốt để gây ra các bản dựng lỗi để hoạt động khác biệt đáng kể so với bản phát hành bản phát hành theo mặc định. –

+0

@KyleStrand Bạn có nghĩa là 'stdout' và' stderr', đúng không? – Angew

16

QDebug là "luồng đầu ra cho thông tin gỡ lỗi". Nó có nó phù hợp với hành vi mặc định là in để stdout/stderr tùy thuộc vào loại tin nhắn. Bạn có thể tùy chỉnh hành vi qDebug() dễ dàng bằng cách cài đặt trình xử lý tin nhắn riêng. Ví dụ bạn có thể kiểm tra tại thời gian chạy (không biên dịch thời gian) nếu bạn muốn in các lỗi. Hãy xem mẫu mã này:

#include <QDebug> 

void noMessageOutput(QtMsgType type, const char *msg) 
{ 
    Q_UNUSED(type); 
    Q_UNUSED(msg); 
} 

int main(int argc, char * argv[]) 
{ 
    QApplication app(argc, argv); 

    if (! app.arguments().contains(QLatin1String("--with-debug")) { 
     qInstallMsgHandler(noMessageOutput); 
    } 
} 

Nó sẽ ẩn toàn bộ đầu ra qDebug nếu không có tham số nào được chỉ định trong thời gian chạy. Bạn có nhiều quyền kiểm soát hơn chỉ "hiển thị gỡ lỗi/không hiển thị gỡ lỗi"

Ngoài ra bạn hoàn toàn có thể vô hiệu hóa QDebug với QT_NO_DEBUG_OUTPUT xác định xem bạn có quan tâm đến hiệu suất bị mất với qDebug trong mã.

0

Sử dụng này để ngăn chặn tin nhắn trong chế độ phát hành nhưng cho phép chúng trong chế độ gỡ lỗi:

CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT 

Nếu bạn chỉ sử dụng DEFINES += QT_NO_DEBUG_OUTPUT mà không cần phần CONFIG(...) bạn sẽ vô hiệu hóa chúng trong cả hai chế độ, mà thường là không mong muốn.

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