Lập trình D - Biên dịch có điều kiện

Biên dịch có điều kiện là quá trình chọn mã nào để biên dịch và mã nào không biên dịch tương tự như #if / #else / #endif trong C và C ++. Bất kỳ câu lệnh nào không được biên dịch trong vẫn phải đúng về mặt cú pháp.

Biên dịch có điều kiện liên quan đến việc kiểm tra điều kiện có giá trị tại thời điểm biên dịch. Các câu lệnh điều kiện thời gian chạy như if, for, while không phải là các tính năng biên dịch có điều kiện. Các tính năng sau của D dùng để biên dịch có điều kiện:

  • debug
  • version
  • tĩnh nếu

Tuyên bố gỡ lỗi trong D

Các debug rất hữu ích trong quá trình phát triển chương trình. Các biểu thức và câu lệnh được đánh dấu là gỡ lỗi chỉ được biên dịch vào chương trình khi bật công tắc trình biên dịch -debug.

debug a_conditionally_compiled_expression;
   
debug { 
   // ... conditionally compiled code ... 
} else { 
   // ... code that is compiled otherwise ... 
}

Mệnh đề else là tùy chọn. Cả biểu thức đơn và khối mã ở trên chỉ được biên dịch khi bật chuyển đổi trình biên dịch -debug.

Thay vì bị xóa hoàn toàn, các dòng có thể được đánh dấu là gỡ lỗi.

debug writefln("%s debug only statement", value);

Những dòng như vậy chỉ được đưa vào chương trình khi bật công tắc trình biên dịch -debug.

dmd test.d -oftest -w -debug

Câu lệnh Debug (tag) trong D

Các câu lệnh gỡ lỗi có thể được đặt tên (thẻ) để đưa vào chương trình một cách chọn lọc.

debug(mytag) writefln("%s not found", value);

Những dòng như vậy chỉ được đưa vào chương trình khi bật công tắc trình biên dịch -debug.

dmd test.d -oftest -w -debug = mytag

Các khối gỡ lỗi cũng có thể có thẻ.

debug(mytag) { 
   //  
}

Có thể bật nhiều thẻ gỡ lỗi cùng một lúc.

dmd test.d -oftest -w -debug = mytag1 -debug = mytag2

Câu lệnh gỡ lỗi (cấp độ) trong D

Đôi khi, việc liên kết các câu lệnh gỡ lỗi theo cấp số sẽ hữu ích hơn. Tăng cấp độ có thể cung cấp thông tin chi tiết hơn.

import std.stdio;  

void myFunction() { 
   debug(1) writeln("debug1"); 
   debug(2) writeln("debug2");
}

void main() { 
   myFunction(); 
}

Các biểu thức gỡ lỗi và các khối thấp hơn hoặc bằng mức được chỉ định sẽ được biên dịch.

$ dmd test.d -oftest -w -debug = 1 
$ ./test 
debug1

Phiên bản (thẻ) và Phiên bản (cấp độ) Tuyên bố trong D

Phiên bản tương tự như gỡ lỗi và được sử dụng theo cách tương tự. Mệnh đề else là tùy chọn. Mặc dù phiên bản hoạt động về cơ bản giống như gỡ lỗi, nhưng việc có các từ khóa riêng biệt sẽ giúp phân biệt các cách sử dụng không liên quan của chúng. Cũng như gỡ lỗi, nhiều phiên bản có thể được bật.

import std.stdio;  

void myFunction() { 
   version(1) writeln("version1"); 
   version(2) writeln("version2");     
}
  
void main() { 
   myFunction(); 
}

Các biểu thức gỡ lỗi và các khối thấp hơn hoặc bằng mức được chỉ định sẽ được biên dịch.

$ dmd test.d -oftest -w -version = 1 
$ ./test 
version1

Tĩnh nếu

Static if là thời gian biên dịch tương đương với câu lệnh if. Cũng giống như câu lệnh if, static if nhận một biểu thức logic và đánh giá nó. Không giống như câu lệnh if, static if không phải là về luồng thực thi; thay vào đó, nó xác định xem một đoạn mã có nên được đưa vào chương trình hay không.

Biểu thức if không liên quan đến toán tử is mà chúng ta đã thấy trước đó, cả về mặt cú pháp và ngữ nghĩa. Nó được đánh giá tại thời điểm biên dịch. Nó tạo ra một giá trị int, 0 hoặc 1; tùy thuộc vào biểu thức được chỉ định trong ngoặc đơn. Mặc dù biểu thức mà nó nhận không phải là một biểu thức logic, bản thân biểu thức is được sử dụng như một biểu thức logic thời gian biên dịch. Nó đặc biệt hữu ích trong điều kiện tĩnh if và ràng buộc mẫu.

import std.stdio;

enum Days { 
   sun, 
   mon, 
   tue, 
   wed, 
   thu, 
   fri, 
   sat 
}; 
 
void myFunction(T)(T mytemplate) {
   static if (is (T == class)) { 
      writeln("This is a class type"); 
   } else static if (is (T == enum)) { 
      writeln("This is an enum type"); 
   } 
}
  
void main() { 
   Days day; 
   myFunction(day); 
}

Khi chúng tôi biên dịch và chạy, chúng tôi sẽ nhận được một số đầu ra như sau.

This is an enum type