Bộ tiền xử lý Objective-C
Các Objective-C Preprocessorkhông phải là một phần của trình biên dịch, nhưng là một bước riêng biệt trong quá trình biên dịch. Nói một cách dễ hiểu, Objective-C Preprocessor chỉ là một công cụ thay thế văn bản và nó hướng dẫn trình biên dịch thực hiện xử lý trước cần thiết trước khi biên dịch thực sự. Chúng tôi sẽ gọi Bộ tiền xử lý Objective-C là OCPP.
Tất cả các lệnh tiền xử lý bắt đầu bằng ký hiệu bảng Anh (#). Nó phải là ký tự không trống đầu tiên và để dễ đọc, chỉ thị tiền xử lý phải bắt đầu trong cột đầu tiên. Phần sau liệt kê tất cả các chỉ thị tiền xử lý quan trọng -
Sr.No. | Chỉ thị & Mô tả |
---|---|
1 | #define Thay thế macro bộ xử lý trước |
2 | #include Chèn một tiêu đề cụ thể từ một tệp khác |
3 | #undef Hoàn tác xác định macro bộ xử lý trước |
4 | #ifdef Trả về true nếu macro này được xác định |
5 | #ifndef Trả về true nếu macro này không được xác định |
6 | #if Kiểm tra xem điều kiện thời gian biên dịch có đúng không |
7 | #else Giải pháp thay thế cho #if |
số 8 | #elif #else an #if trong một câu lệnh |
9 | #endif Kết thúc tiền xử lý có điều kiện |
10 | #error In thông báo lỗi trên stderr |
11 | #pragma Đưa ra các lệnh đặc biệt cho trình biên dịch bằng cách sử dụng phương pháp chuẩn hóa |
Ví dụ về bộ tiền xử lý
Phân tích các ví dụ sau để hiểu các chỉ thị khác nhau.
#define MAX_ARRAY_LENGTH 20
Lệnh này yêu cầu OCPP thay thế các trường hợp MAX_ARRAY_LENGTH bằng 20. Sử dụng #define cho các hằng số để tăng khả năng đọc.
#import <Foundation/Foundation.h>
#include "myheader.h"
Các chỉ thị này yêu cầu OCPP có được nền tảng.h từ Foundation Frameworkvà thêm văn bản vào tệp nguồn hiện tại. Dòng tiếp theo cho biết OCPP lấymyheader.h từ thư mục cục bộ và thêm nội dung vào tệp nguồn hiện tại.
#undef FILE_SIZE
#define FILE_SIZE 42
Điều này yêu cầu OCPP hủy xác định FILE_SIZE hiện có và xác định nó là 42.
#ifndef MESSAGE
#define MESSAGE "You wish!"
#endif
Điều này yêu cầu OCPP chỉ xác định MESSAGE nếu MESSAGE chưa được xác định.
#ifdef DEBUG
/* Your debugging statements here */
#endif
Điều này cho OCPP thực hiện quy trình với các câu lệnh kèm theo nếu DEBUG được xác định. Điều này rất hữu ích nếu bạn chuyển cờ -DDEBUG cho trình biên dịch gcc tại thời điểm biên dịch. Thao tác này sẽ xác định Gỡ lỗi, vì vậy bạn có thể bật và tắt gỡ lỗi ngay lập tức trong quá trình biên dịch.
Macro được xác định trước
ANSI C xác định một số macro. Mặc dù mỗi cái đều có sẵn để bạn sử dụng trong lập trình, bạn không nên sửa đổi trực tiếp các macro được xác định trước.
Sr.No. | Macro & Mô tả |
---|---|
1 | __DATE__ Ngày hiện tại dưới dạng một ký tự ở định dạng "MMM DD YYYY" |
2 | __TIME__ Thời gian hiện tại dưới dạng một ký tự ở định dạng "HH: MM: SS" |
3 | __FILE__ Điều này chứa tên tệp hiện tại dưới dạng một chuỗi ký tự. |
4 | __LINE__ Điều này chứa số dòng hiện tại dưới dạng hằng số thập phân. |
5 | __STDC__ Được xác định là 1 khi trình biên dịch tuân thủ tiêu chuẩn ANSI. |
Hãy thử ví dụ sau:
#import <Foundation/Foundation.h>
int main() {
NSLog(@"File :%s\n", __FILE__ );
NSLog(@"Date :%s\n", __DATE__ );
NSLog(@"Time :%s\n", __TIME__ );
NSLog(@"Line :%d\n", __LINE__ );
NSLog(@"ANSI :%d\n", __STDC__ );
return 0;
}
Khi mã trên trong một tệp main.m được biên dịch và thực thi, nó tạo ra kết quả sau:
2013-09-14 04:46:14.859 demo[20683] File :main.m
2013-09-14 04:46:14.859 demo[20683] Date :Sep 14 2013
2013-09-14 04:46:14.859 demo[20683] Time :04:46:14
2013-09-14 04:46:14.859 demo[20683] Line :8
2013-09-14 04:46:14.859 demo[20683] ANSI :1
Nhà điều hành tiền xử lý
Bộ tiền xử lý Objective-C cung cấp các toán tử sau để giúp bạn tạo macro -
Tiếp tục Macro (\)
Một macro thường phải được chứa trên một dòng. Toán tử tiếp tục macro được sử dụng để tiếp tục một macro quá dài đối với một dòng. Ví dụ -
#define message_for(a, b) \
NSLog(@#a " and " #b ": We love you!\n")
Kích thước chuỗi (#)
Toán tử chuỗi ký tự hoặc ký hiệu số ('#'), khi được sử dụng trong định nghĩa macro, chuyển đổi một tham số macro thành một hằng số chuỗi. Toán tử này chỉ có thể được sử dụng trong một macro có đối số hoặc danh sách tham số được chỉ định. Ví dụ -
#import <Foundation/Foundation.h>
#define message_for(a, b) \
NSLog(@#a " and " #b ": We love you!\n")
int main(void) {
message_for(Carole, Debra);
return 0;
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
2013-09-14 05:46:14.859 demo[20683] Carole and Debra: We love you!
Dán mã thông báo (##)
Toán tử dán mã thông báo (##) trong định nghĩa macro kết hợp hai đối số. Nó cho phép hai mã thông báo riêng biệt trong định nghĩa macro được kết hợp thành một mã thông báo duy nhất. Ví dụ -
#import <Foundation/Foundation.h>
#define tokenpaster(n) NSLog (@"token" #n " = %d", token##n)
int main(void) {
int token34 = 40;
tokenpaster(34);
return 0;
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
2013-09-14 05:48:14.859 demo[20683] token34 = 40
Nó đã xảy ra như thế nào, bởi vì ví dụ này dẫn đến kết quả thực tế sau đây từ bộ tiền xử lý -
NSLog (@"token34 = %d", token34);
Ví dụ này cho thấy sự nối mã thông báo ## n vào mã thông báo34 và ở đây chúng tôi đã sử dụng cả hai stringize và token-pasting.
Toán tử () được xác định
Bộ tiền xử lý definedtoán tử được sử dụng trong các biểu thức hằng để xác định xem một số nhận dạng có được xác định bằng cách sử dụng #define hay không. Nếu số nhận dạng được chỉ định được xác định, giá trị là true (khác 0). Nếu ký hiệu không được xác định, giá trị là false (không). Toán tử đã định nghĩa được chỉ định như sau:
#import <Foundation/Foundation.h>
#if !defined (MESSAGE)
#define MESSAGE "You wish!"
#endif
int main(void) {
NSLog(@"Here is the message: %s\n", MESSAGE);
return 0;
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
2013-09-14 05:48:19.859 demo[20683] Here is the message: You wish!
Macro được tham số hóa
Một trong những chức năng mạnh mẽ của OCPP là khả năng mô phỏng các chức năng bằng cách sử dụng macro được tham số hóa. Ví dụ: chúng ta có thể có một số mã để bình phương một số như sau:
int square(int x) {
return x * x;
}
Chúng ta có thể viết lại đoạn mã trên bằng macro như sau:
#define square(x) ((x) * (x))
Macro có đối số phải được xác định bằng cách sử dụng #definechỉ thị trước khi chúng có thể được sử dụng. Danh sách đối số được đặt trong dấu ngoặc đơn và phải ngay sau tên macro. Không được phép có dấu cách giữa tên macro và dấu ngoặc đơn mở. Ví dụ -
#import <Foundation/Foundation.h>
#define MAX(x,y) ((x) > (y) ? (x) : (y))
int main(void) {
NSLog(@"Max between 20 and 10 is %d\n", MAX(10, 20));
return 0;
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
2013-09-14 05:52:15.859 demo[20683] Max between 20 and 10 is 20