Hướng dẫn入门: Vĩ lệnh trong C

Xin chào các bạn tương lai của các lập trình viên! Hôm nay, chúng ta sẽ cùng khám phá thế giới kỳ diệu của các vĩ lệnh trong C. Đừng lo lắng nếu bạn chưa từng viết một dòng mã nào trước đây - tôi sẽ là người bạn thân thiện dẫn đường cho bạn trong hành trình này. Cuối bài hướng dẫn này, bạn sẽ ngạc nhiên về lượng kiến thức bạn đã học được!

C - Macros

Vĩ lệnh là gì?

Trước khi chúng ta bắt đầu, hãy hiểu rõ vĩ lệnh là gì. Hãy tưởng tượng vĩ lệnh như những phím tắt hoặc mẫu trong mã của bạn. Chúng giống như những người giúp việc nhỏ giúp cuộc sống lập trình của bạn dễ dàng hơn và chương trình của bạn hiệu quả hơn.

Vĩ lệnh kiểu đối tượng

Hãy bắt đầu với hình thức đơn giản nhất của vĩ lệnh: vĩ lệnh kiểu đối tượng.

Định nghĩa và cú pháp

Vĩ lệnh kiểu đối tượng được định nghĩa bằng cách sử dụng chỉ thị #define. Dưới đây là cú pháp cơ bản:

#define TÊN_VĨ_LỆNH giá_trị

Ví dụ

Hãy xem một số ví dụ:

#define PI 3.14159
#define MAX_SINHVIÊN 100
#define TÊN_TRƯỜNG "Học viện Lập trình viên"

Trong các ví dụ này, mỗi khi bộ biên dịch thấy PI, nó sẽ thay thế bằng 3.14159. Tương tự, MAX_SINHVIÊN sẽ được thay thế bằng 100, và TÊN_TRƯỜNG bằng "Học viện Lập trình viên".

Sử dụng trong mã

Bây giờ, hãy xem cách chúng ta có thể sử dụng các vĩ lệnh trong mã của mình:

#include <stdio.h>

#define PI 3.14159
#define MAX_SINHVIÊN 100

int main() {
float bán_kính = 5.0;
float diện_tích = PI * bán_kính * bán_kính;

printf("Diện tích của hình tròn là: %.2f\n", diện_tích);
printf("Trường của chúng tôi có thể chứa %d sinh viên.\n", MAX_SINHVIÊN);

return 0;
}

Khi bạn chạy chương trình này, nó sẽ输出:

Diện tích của hình tròn là: 78.54
Trường của chúng tôi có thể chứa 100 sinh viên.

Thật tuyệt vời phải không? Chúng ta đã sử dụng vĩ lệnh như chúng ta sử dụng các biến thông thường, nhưng chúng thực sự được thay thế bằng giá trị của chúng trước khi chương trình được biên dịch.

Vĩ lệnh kiểu hàm

Bây giờ, hãy nâng cấp và xem xét các vĩ lệnh kiểu hàm. Đây là những vĩ lệnh trông như hàm nhưng hoạt động hơi khác một chút.

Định nghĩa và cú pháp

Cú pháp cho vĩ lệnh kiểu hàm là:

#define TÊN_VĨ_LỆNH(tham_số) (thân_vĩ_lệnh)

Ví dụ

Dưới đây là một vài ví dụ:

#define ĐIÊN_TÍCH_HÌNH_CHỮ_NHAT(a, b) ((a) * (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))

Sử dụng trong mã

Hãy sử dụng các vĩ lệnh này trong một chương trình:

#include <stdio.h>

#define ĐIÊN_TÍCH_HÌNH_CHỮ_NHAT(a, b) ((a) * (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))

int main() {
int num1 = 5, num2 = 7;

printf("Diện tích của hình chữ nhật là %d\n", ĐIÊN_TÍCH_HÌNH_CHỮ_NHAT(num1, num2));
printf("Giá trị lớn nhất của %d và %d là %d\n", num1, num2, MAX(num1, num2));

return 0;
}

Chương trình này sẽ输出:

Diện tích của hình chữ nhật là 35
Giá trị lớn nhất của 5 và 7 là 7

Lưu ý cách ĐIÊN_TÍCH_HÌNH_CHỮ_NHAT(5, 7) được thay thế bằng ((5) * (7)), và MAX(5, 7) bằng ((5) > (7) ? (5) : (7)) trước khi chương trình được biên dịch.

Vĩ lệnh liên kết

Vĩ lệnh liên kết là khi một vĩ lệnh sử dụng một vĩ lệnh khác trong định nghĩa của nó. Nó giống như vĩ lệnh trong vĩ lệnh!

Ví dụ

#define ĐIÊN_TÍCH_HÌNH_CHỮ_NHAT(a, b) ((a) * (b))
#define LỚP_HÌNH_LẬP_PHỤC(a) (ĐIÊN_TÍCH_HÌNH_CHỮ_NHAT(a, a) * a)

Ở đây, LỚP_HÌNH_LẬP_PHỤC sử dụng ĐIÊN_TÍCH_HÌNH_CHỮ_NHAT trong định nghĩa của nó. Khi bạn sử dụng LỚP_HÌNH_LẬP_PHỤC(3), nó trước hết mở rộng thành (ĐIÊN_TÍCH_HÌNH_CHỮ_NHAT(3, 3) * 3), sau đó tiếp tục mở rộng thành (((3) * (3)) * (3)).

Vĩ lệnh đa tham số

Vĩ lệnh đa tham số rất tuyệt vời vì chúng có thể chấp nhận số lượng tham số thay đổi. Chúng giống như các瑞士军刀 của vĩ lệnh!

Cú pháp

#define TÊN_VĨ_LỆNH(tham_số...) thân_vĩ_lệnh

Ví dụ

#include <stdio.h>

#define DEBUG_PRINT(format, ...) printf("Debug: " format "\n", ##__VA_ARGS__)

int main() {
int x = 5;
float y = 3.14;

DEBUG_PRINT("x = %d", x);
DEBUG_PRINT("x = %d, y = %.2f", x, y);

return 0;
}

Chương trình này sẽ输出:

Debug: x = 5
Debug: x = 5, y = 3.14

Kí tự ... trong định nghĩa vĩ lệnh cho phép nó chấp nhận bất kỳ số lượng tham số nào, và __VA_ARGS__ được thay thế bằng các tham số này trong thân vĩ lệnh.

Vĩ lệnh đã định nghĩa sẵn

C cung cấp một số vĩ lệnh đã định nghĩa sẵn rất hữu ích. Dưới đây là một vài ví dụ:

Vĩ lệnh Mô tả
__FILE__ Tên tệp hiện tại
__LINE__ Số dòng hiện tại
__DATE__ Ngày biên dịch
__TIME__ Thời gian biên dịch
__STDC__ 1 nếu bộ biên dịch tuân thủ ANSI C

Ví dụ

#include <stdio.h>

int main() {
printf("Tệp này là %s\n", __FILE__);
printf(" Đây là dòng %d\n", __LINE__);
printf("Biên dịch vào %s lúc %s\n", __DATE__, __TIME__);
return 0;
}

Chương trình này sẽ输出 điều gì đó như:

Tệp này là example.c
Đây là dòng 5
Biên dịch vào Jul 10 2023 lúc 15:30:45

Và thế là bạn đã bước vào thế giới của các vĩ lệnh trong C. Nhớ rằng, như bất kỳ công cụ mạnh mẽ nào khác, vĩ lệnh nên được sử dụng một cách khôn ngoan. Chúng có thể làm cho mã của bạn hiệu quả và dễ đọc hơn, nhưng việc lạm dụng có thể dẫn đến sự rối loạn. Hãy tập luyện, thử nghiệm, và sớm bạn sẽ thành thạo việc sử dụng vĩ lệnh!

Credits: Image by storyset