Trong phần này, chúng ta sẽ thấy sự khác biệt giữa macro và hàm trong C. Các macro được xử lý trước, vì vậy có nghĩa là tất cả các macro sẽ được xử lý trước trong khi nó được biên dịch. Các chức năng không được xử lý trước mà được biên dịch.
Trong macro, không có kiểm tra kiểu nào được thực hiện, vì vậy nó có thể xảy ra một số vấn đề đối với các loại đầu vào khác nhau. Trong trường hợp của các chức năng, điều này không được thực hiện. Ngoài ra, đối với macro nếu các đầu vào không được duy trì đúng cách, thì nó có thể tạo ra một số kết quả không hợp lệ. Vui lòng kiểm tra chương trình sau để biết ý tưởng về vấn đề.
Ví dụ
#include <stdio.h> #define SQUARE(x) x * x int sqr(int x) { return x*x; } main() { printf("Use of sqr(). The value of sqr(3+2): %d\n", sqr(3+2)); printf("Use of SQUARE(). The value of SQUARE(3+2): %d", SQUARE(3+2)); }
Đầu ra
Use of sqr(). The value of sqr(3+2): 25 Use of SQUARE(). The value of SQUARE(3+2): 11
Hàm và macro, chúng ta muốn cả hai sẽ làm cùng một nhiệm vụ, nhưng ở đây chúng ta có thể thấy rằng đầu ra không giống nhau. Lý do chính là khi chúng ta chuyển 3 + 2 dưới dạng đối số hàm, nó chuyển thành 5, sau đó tính 5 * 5 =25. Đối với macro, nó đang thực hiện 3 + 2 * 3 + 2 =3 + 6 + 2 =11.
Vì vậy, các macro không được khuyến nghị cho các sự cố sau -
-
Không có kiểu kiểm tra nào
-
Mặc định để gỡ lỗi, vì chúng gây ra thay thế đơn giản
-
Macro không có vùng tên. Vì vậy, nếu macro được xác định trong một phần, nó có thể được sử dụng ở phần khác.
-
Macro tăng độ dài mã khi nó được thêm vào trước mã trong khi xử lý trước.
-
Macro không kiểm tra bất kỳ lỗi thời gian biên dịch nào.