Tiền xử lý (Preprocessor)
Cho đến thời điểm này, chúng ta đã nghiên cứu lập trình MQL5 với giả định rằng các mã nguồn được xử lý bởi trình biên dịch, chuyển đổi biểu diễn văn bản của chúng thành dạng nhị phân (có thể thực thi bởi terminal). Tuy nhiên, công cụ đầu tiên đọc và, nếu cần, chuyển đổi mã nguồn là tiền xử lý (preprocessor). Tiện ích này được tích hợp trong MetaEditor và được điều khiển bởi các chỉ thị đặc biệt được chèn trực tiếp vào mã nguồn. Nó có thể giải quyết một số vấn đề mà lập trình viên gặp phải khi chuẩn bị mã nguồn.
Tương tự như tiền xử lý của C++, MQL5 hỗ trợ định nghĩa các thay thế macro (#define
), biên dịch có điều kiện (#ifdef
) và bao gồm các tệp mã nguồn khác (#include
). Trong chương này, chúng ta sẽ khám phá những khả năng này. Một số trong số chúng có giới hạn so với C++.
Ngoài các chỉ thị tiêu chuẩn, tiền xử lý MQL5 có các chỉ thị đặc thù riêng, đặc biệt là tập hợp các thuộc tính của chương trình MQL (#property
), và nhập khẩu hàm từ các tệp EX5 và DLL riêng biệt (#import
). Chúng ta sẽ đề cập đến chúng trong các phần thứ năm, thứ sáu và thứ bảy khi nghiên cứu các loại chương trình MQL khác nhau.
Tất cả các chỉ thị tiền xử lý bắt đầu bằng dấu thăng '#' theo sau là một từ khóa và các tham số bổ sung, cú pháp của chúng phụ thuộc vào loại chỉ thị.
Nên bắt đầu một chỉ thị tiền xử lý từ ngay đầu dòng, hoặc ít nhất sau một khoảng thụt đầu dòng (nếu các chỉ thị được lồng nhau). Việc chèn một chỉ thị bên trong các câu lệnh mã nguồn được coi là phong cách lập trình không tốt (khác với MQL5, tiền xử lý C++ không cho phép điều này).
Các chỉ thị tiền xử lý không phải là câu lệnh ngôn ngữ và không nên kết thúc bằng dấu ';'. Các chỉ thị thường tiếp tục đến cuối dòng hiện tại. Trong một số trường hợp, chúng có thể được mở rộng một cách đặc biệt cho các dòng tiếp theo, điều này sẽ được thảo luận riêng.
Các chỉ thị được thực thi tuần tự, theo thứ tự xuất hiện trong văn bản và có tính đến việc xử lý các chỉ thị trước đó. Ví dụ, nếu một tệp khác được kết nối với tệp bằng chỉ thị #include
và một quy tắc thay thế được định nghĩa trong tệp được bao gồm bằng #define
, thì quy tắc này bắt đầu hoạt động cho tất cả các dòng mã tiếp theo, bao gồm cả các tệp tiêu đề được bao gồm sau đó.
Tiền xử lý không xử lý các bình luận.