Đề XuấT, 2024

Editor Choice

Sự khác biệt giữa Inline và Macro trong C ++

Macro là một lệnh mở rộng tại thời điểm gọi của nó. Các chức năng cũng có thể được định nghĩa, như macro. Tương tự, các hàm nội tuyến cũng mở rộng tại điểm gọi của nó. Một điểm khác biệt chính giữa hàm nội tuyến và hàm macro là các hàm nội tuyến được mở rộng trong quá trình biên dịch và các macro được mở rộng khi chương trình được xử lý bởi bộ tiền xử lý .

Hãy nghiên cứu sự khác biệt giữa nội tuyến và vĩ mô với sự trợ giúp của biểu đồ so sánh.

Biểu đồ so sánh

Cơ sở để so sánhNội tuyếnVĩ mô
Căn bảnCác hàm nội tuyến được phân tích cú pháp bởi trình biên dịch.Macro được mở rộng bởi bộ tiền xử lý.
Cú phápreturn return_type func_name (tham số) {. . . }#define macro_name char_ resultence
Từ khóa được sử dụngnội tuyến
#định nghĩa
Xác địnhNó có thể được định nghĩa bên trong hoặc bên ngoài lớp.Nó luôn được xác định khi bắt đầu chương trình.
Đánh giáNó đánh giá đối số chỉ một lần.Nó đánh giá đối số mỗi lần nó được sử dụng trong mã.
Sự bành trướngTrình biên dịch có thể không nội tuyến và mở rộng tất cả các chức năng.Macro luôn được mở rộng.
Tự động hóaCác hàm ngắn, được định nghĩa bên trong lớp được tự động tạo thành các hàm nội tuyến.Macro nên được xác định cụ thể.
Truy cậpMột hàm thành viên nội tuyến có thể truy cập các thành viên dữ liệu của lớp.Macro không bao giờ có thể là thành viên của lớp và không thể truy cập các thành viên dữ liệu của lớp.
Chấm dứtĐịnh nghĩa hàm nội tuyến chấm dứt với dấu ngoặc nhọn ở cuối hàm nội tuyến.Định nghĩa vĩ mô chấm dứt với dòng mới.
Gỡ lỗiGỡ lỗi dễ dàng cho một hàm nội tuyến vì việc kiểm tra lỗi được thực hiện trong quá trình biên dịch.Việc gỡ lỗi trở nên khó khăn đối với các macro vì việc kiểm tra lỗi không xảy ra trong quá trình biên dịch.
Ràng buộcMột hàm nội tuyến liên kết tất cả các câu lệnh trong phần thân của hàm cũng như phần thân của hàm bắt đầu và kết thúc bằng dấu ngoặc nhọn.Một macro phải đối mặt với vấn đề ràng buộc nếu nó có nhiều hơn một câu lệnh, vì nó không có ký hiệu kết thúc.

Định nghĩa nội tuyến

Một hàm nội tuyến trông giống như một hàm thông thường, nhưng trước từ khóa là dòng inline . Các hàm nội tuyến là các hàm có độ dài ngắn được mở rộng tại điểm gọi của nó, thay vì được gọi. Hãy hiểu các hàm nội tuyến với một ví dụ.

 #include bằng cách sử dụng không gian tên std; ví dụ lớp {int a, b; công khai: nội tuyến void khởi tạo (int x, int y) {a = x; b = y} void display () {cout << a << "" < 

Trong chương trình trên, tôi đã khai báo và định nghĩa, khởi tạo hàm (), như là một hàm nội tuyến trong lớp Ví dụ lớp. Mã của hàm khởi tạo () sẽ mở rộng nơi nó được gọi bởi đối tượng của lớp Ví dụ ví dụ. Hiển thị hàm (), được định nghĩa trong ví dụ lớp không được khai báo nội tuyến nhưng nó có thể được trình biên dịch xem là nội tuyến trong C ++, hàm được định nghĩa bên trong lớp được trình biên dịch tự động tạo thành nội tuyến bằng cách xem xét độ dài của hàm.

  • Hàm nội tuyến giảm chi phí gọi và trả lại chức năng, từ đó giảm thời gian thực hiện chương trình. Ngoài ra, các đối số được đẩy lên ngăn xếp và các thanh ghi được lưu khi một hàm được gọi và đặt lại khi hàm trả về, điều này làm mất thời gian, điều này được tránh bởi các hàm nội tuyến vì không cần phải tạo biến cục bộ và tham số chính thức mỗi lần .
  • Các hàm nội tuyến có thể là thành viên của lớp và cũng có thể truy cập thành viên dữ liệu của lớp.
  • Hàm nội tuyến giúp giảm thời gian thực hiện chương trình, nhưng, đôi khi nếu độ dài của hàm nội tuyến lớn hơn thì kích thước của chương trình cũng sẽ tăng do mã trùng lặp. Do đó, nó là một thực hành tốt để nội tuyến các chức năng rất nhỏ.
  • Đối số của hàm nội tuyến chỉ được đánh giá một lần.

Định nghĩa vĩ mô

Macro là một bộ tiền xử lý trực tiếp. Trước khi biên dịch, chương trình được kiểm tra bởi bộ tiền xử lý và bất cứ khi nào nó tìm thấy macro trong chương trình, nó sẽ thay thế macro đó theo định nghĩa của nó. Do đó, macro được coi là văn bản thay thế trên văn bản. Hãy để chúng tôi nghiên cứu vĩ mô với một ví dụ.

 #include #define GREATER (a, b) ((a <b)? b: a) int main (void) {cout << "Lớn hơn 10 và 20 là" << GREATER ("20", "10") << "\ n"; trả về 0; } 

Trong đoạn mã trên, tôi đã khai báo một hàm macro GREATER (), để so sánh và tìm số lượng lớn hơn của cả hai tham số. Bạn có thể quan sát rằng không có dấu chấm phẩy để chấm dứt macro vì macro chỉ bị chấm dứt bởi dòng mới. Vì macro chỉ là một văn bản thay thế, nó sẽ mở rộng mã của macro nơi nó được gọi.

  • Các macro luôn được định nghĩa trong các chữ in hoa chỉ để giúp các lập trình viên dễ dàng xác định tất cả các macro trong chương trình trong khi đọc.
  • Macro không bao giờ có thể là hàm thành viên của lớp và cũng không thể truy cập các thành viên dữ liệu của bất kỳ lớp nào.
  • Hàm macro đánh giá đối số mỗi lần nó xuất hiện trong định nghĩa của nó dẫn đến kết quả không mong muốn.
  • Macro phải có kích thước nhỏ hơn vì các macro lớn hơn sẽ tăng kích thước mã một cách không cần thiết.

Sự khác biệt chính giữa Inline và Macro

  1. Sự khác biệt cơ bản giữa nội tuyến và macro là các hàm nội tuyến được trình biên dịch phân tích cú pháp trong khi đó, các macro trong chương trình được mở rộng bằng bộ xử lý trước.
  2. Từ khóa được sử dụng để xác định chức năng nội tuyến là dòng nội tuyến, trong khi đó, từ khóa được sử dụng để xác định macro là siêu tốc #define .
  3. Khi chức năng nội tuyến là decalre bên trong một lớp, nó có thể được định nghĩa bên trong một lớp hoặc bên ngoài một lớp. Mặt khác, một macro luôn được xác định khi bắt đầu chương trình.
  4. Đối số được truyền cho các hàm nội tuyến chỉ được đánh giá một lần trong khi biên dịch trong khi đó, đối số macro được đánh giá mỗi khi macro được sử dụng trong mã.
  5. Trình biên dịch có thể không nội tuyến và mở rộng tất cả các hàm được định nghĩa bên trong một lớp. Mặt khác, macro luôn được mở rộng.
  6. Hàm ngắn được định nghĩa bên trong một lớp không có từ khóa nội tuyến được tự động tạo các hàm nội tuyến. Mặt khác, Macro cần được xác định cụ thể.
  7. Một hàm là nội tuyến có thể truy cập các thành viên của lớp trong khi đó, một macro không bao giờ có thể truy cập các thành viên của lớp.
  8. Để chấm dứt chức năng nội tuyến, một dấu ngoặc nhọn đóng là bắt buộc trong khi đó, macro được kết thúc khi bắt đầu một dòng mới.
  9. Gỡ lỗi trở nên dễ dàng cho chức năng inlne vì nó được kiểm tra trong quá trình biên dịch cho bất kỳ lỗi nào. Mặt khác, một macro không được kiểm tra trong khi biên dịch, do đó, việc gỡ lỗi một macro trở nên khó khăn.
  10. Là một chức năng, một hàm nội tuyến liên kết các thành viên của nó trong một dấu ngoặc nhọn bắt đầu và đóng. Mặt khác, macro không có bất kỳ ký hiệu chấm dứt nào, do đó, ràng buộc trở nên khó khăn khi macro chứa nhiều hơn một câu lệnh.

Kết luận:

Các chức năng nội tuyến có sức thuyết phục hơn nhiều so với chức năng vĩ mô. C ++ cũng cung cấp một cách tốt hơn để xác định hằng số, sử dụng từ khóa của const const.

Top