Lợi Ích của Macro trong Lập Trình C++
Macro là một công cụ mạnh mẽ giúp lập trình viên viết mã ngắn gọn và dễ hiểu hơn. Để định nghĩa một macro, ta sử dụng từ khóa #define
. Dưới đây là ví dụ về việc định nghĩa một số macro thông dụng:
#define PB push_back
#define MP make_pair
#define FI first
#define SE second
Giả sử bạn có đoạn mã sau:
v.push_back(make_pair(y1, x1));
v.push_back(make_pair(y2, x2));
int d = v[i].first + v[i].second;
Sau khi sử dụng các macro ở trên, mã sẽ trở nên ngắn gọn hơn:
v.PB(MP(y1, x1));
v.PB(MP(y2, x2));
int d = v[i].FI + v[i].SE;
Khi lập trình C++, nhiều người thường có thói quen sử dụng từ khóa endl
để xuống dòng. Tuy nhiên, theo phân tích trong video bài số 2 của series "Lên trình Thuật toán - Lập trình thi đấu 🏆", sử dụng "\n"
hiệu quả hơn so với endl
. Bạn có thể định nghĩa một macro như sau để tối ưu hóa thời gian chạy:
#define endl "\n"
Lưu Ý Khi Sử Dụng Macro
Mặc dù macro rất hữu ích, nhưng nếu không sử dụng đúng cách, nó có thể gây ra những lỗi khó phát hiện. Chẳng hạn, với một macro tính bình phương của một số:
#define SQ(a) a*a
Khi bạn truyền vào 3
:
cout << SQ(3);
Kết quả là 9
là đúng. Nhưng nếu truyền vào 3+3
:
cout << SQ(3+3);
Kết quả sẽ là 15
, không phải 36
như mong muốn.
Nguyên nhân là do macro trên thực hiện phép toán a*a
như sau:
3 + 3 * 3 + 3 = 15
Để khắc phục, bạn nên sử dụng dấu ngoặc trong macro:
#define SQ(a) (a)*(a)
Bây giờ, khi chạy lại chương trình, kết quả sẽ là đúng:
(3+3) * (3+3) = 6 * 6 = 36
Định Nghĩa Macro Có Tham Số
Ngoài ra, macro có thể có các tham số giúp rút gọn mã. Ví dụ với vòng lặp for
:
for (int i = 1; i <= n; i++)
{
cout << i << endl;
}
Bạn có thể định nghĩa macro như sau:
#define FOR(i,a,b) for (int i = (a); i <= (b); i++)
Khi đó, mã sẽ gọn gàng hơn:
FOR(i,1,n) {
cout << i << endl;
}
Các macro thường được đặt tên bằng các chữ cái viết hoa, giúp dễ nhận biết trong mã.
Hy vọng rằng những kiến thức này sẽ hữu ích cho bạn trong quá trình lập trình và tối ưu mã nguồn! Hẹn gặp lại 👋
source: viblo