2010-07-06 3 views
6

Có cơ chế nào trong D (D2) để buộc mã được biên dịch trong khi xây dựng bản phát hành không?Biên dịch mã để xây dựng bản phát hành trong D

Trong C, bạn có thể có một cái gì đó giống như

#ifndef NDEBUG 
/*Something that will only run in a debug build*/ 
#endif 

Tôi biết rằng D có

debug(mymodule) { 
    //Do something 
} 

Nhưng điều này đòi hỏi người sử dụng để vượt qua -debug cho mỗi mô-đun để kích hoạt nó.

Tôi đang tìm cơ chế toàn cầu sẽ luôn chạy mã trong một bản dựng bình thường nhưng biên dịch nó khi bạn chuyển cờ -release. Tôi biết một số trình cài sẵn có khả năng này (ví dụ: khẳng định), nhưng có cách nào để mã người dùng thực hiện điều đó không?

+1

Tôi nghĩ rằng một phần vấn đề của bạn là 'debug' và' -release' không liên quan gì đến nhau trong D. '-release' ngụ ý rằng bạn đang biên dịch phiên bản phát hành và nó vô hiệu hóa các kiểm tra khác nhau (chẳng hạn như xác nhận). '-debug' cho phép các câu lệnh debug. Như vậy, bạn có thể lập luận rằng không thực sự là một "chế độ gỡ lỗi" trong D. Bạn có chế độ phát hành và chế độ không phát hành với khả năng bật các câu lệnh gỡ lỗi trong cả hai chế độ. Tôi không nghĩ rằng '-release' được cho là thực sự thay đổi ngữ nghĩa của mã của bạn như' -debug', vì vậy đó là lý do tại sao bạn không thể làm những gì bạn đang cố gắng làm. –

+0

Tôi không tìm cách thay đổi ngữ nghĩa cho bản phát hành bản phát hành. Tôi chỉ đang tìm cách tốt nhất để thêm kiểm tra bổ sung, bản in, v.v. trong một bản phát hành không phát hành sẽ luôn được bật trong khi phát triển. Tôi thấy nó như một cái gì đó để cung cấp cho một nhà phát triển để theo dõi các vấn đề nhanh hơn. Các kiểm tra và cảnh báo bổ sung có thể cung cấp cho họ gợi ý về mô-đun nào họ nên bật -debug. – JRM

+1

Tôi đã trả lời, nhưng bằng cách nào đó, tôi cảm thấy xấu về nó. Tôi khuyên bạn chỉ nên sử dụng -debug khi devving và 'debug {// ...}'. Tốt hơn để làm cho nó dễ dàng để làm cho những sai lầm khi devving, hơn khi phát hành, imho. – 0scar

Trả lời

15

Có khái niệm gỡ lỗi toàn cầu. Chỉ cần viết:

debug { 
    ... code ... 
} 
+1

Tôi biết phải có một cái gì đó đơn giản như thế này. Ngôn ngữ lập trình D chỉ đề cập đến việc gỡ lỗi mô-đun cụ thể, vì vậy tôi đã không nhận ra có một cái toàn cục. Bây giờ tôi có thể sử dụng gỡ lỗi {...} để gỡ lỗi và gỡ lỗi cơ bản (mymodule) {...} để thêm gỡ lỗi chi tiết hơn. – JRM

+1

Chính xác. Xin lỗi vì thiếu sót. Tôi đã thêm một lỗi thay cho bạn tại đây: http://www.erdani.com/tdpl/errata/ –

1

Nếu không có câu trả lời tốt hơn được tìm thấy, một hackaround như thế này nên làm việc: bool debugMode() { bool res; assert(!!(res = true)); return res; }

+1

Tôi không thấy cách hoạt động. – BCS

+2

Đó là nhiệm vụ bên trong xác nhận. Trong chế độ phát hành, xác nhận và nội dung của nó được biên dịch. Do đó, nhiệm vụ chỉ diễn ra trong các bản xây dựng không phát hành. –

+2

OP đang tìm kiếm một giải pháp thời gian biên dịch và khẳng định không bao giờ xuất hiện trong CTFE. – BCS

3

dmd -release -version=dist module.d

version(dist) {} else { 
    int i = 9; 
} 

tốt nhất tôi có thể nghĩ đến.

[cập nhật]

Cá nhân, tôi nghĩ câu trả lời ở trên là "xấu". Giải pháp trên sẽ giới thiệu logic quá phức tạp vào quá trình phát hành, mà tôi nghĩ nên thẳng về phía trước và có thể dự đoán được. Tôi khuyên bạn chỉ nên sử dụng -debugdebug{ //... }. Thậm chí nếu bạn cảm thấy bạn có thể quên thêm cờ gỡ lỗi khi bạn đang biên soạn — bạn chỉ đang tìm kiếm! Những sai lầm làm cho nó trở nên tồi tệ hơn.

+0

Nó không hoàn toàn lý tưởng như tôi đã hy vọng, vì bạn cần nhớ chỉ định cờ đảo chiều, nhưng những chi tiết đó có thể bị ẩn khỏi người dùng cuối bên trong hệ thống xây dựng, vì vậy nó sẽ thực hiện. – JRM

+0

Cảm ơn BCS đã sửa chữa. – 0scar