Macro like function là gì

Sự khác nhau giữa inline và macro trong C là gì?

programming
c
TrongDung [Tiger] October 29, 2018, 2:15pm #1

Hello các bác, e lang thang tự dưng gặp được câu hỏi này nên search GG nhưng đọc mãi mà k hiểu.
Những thứ e đọc được và hiểu thì là:

  1. Inline function sẽ báo cho compiler biết rằng hàm đó được đánh dấu là inline, nó sẽ xem xét việc import trực tiếp code của hàm đó vào vị trí của lời gọi hàm. giúp tránh việc push pop stack khi gọi các hàm này.
  2. Không phải lúc nào inline cũng được compiler thực hiện.
  3. có 2 loại inline : static inline và extern inline. [nhưng e chưa biết sự khác nhau giữa nó].
  4. Macro được thực hiện tại thời điểm tiền xử lý [pre-processor] .

Mong các pro ai biết trả lời giúp e để e được thông não ạ. Thanks all.

1 Like
Phong_Ky_Vo [Tao Không Ngu.] October 29, 2018, 3:59pm #2

Hi Trọng Dũng.
Bạn xem thêm về tiền biên dịch. Macro được thực hiện tại thời điểm tiền xử lý, nó sẽ thay thế macro bằng chỗi được định nghĩa. [Copy code ghi đè vào.]

Làm quen với cách viết chương trình C++ trên nhiều file writes
Hi all. Theo mình nhắc đến chia file mã nguồn trong C/C++ không thể không nhắc đến chỉ thị tiền biên dịch //www.stdio.vn/articles/chi-thi-tien-xu-ly-trong-cc-512. Hiểu đơn giản trước khi được chuyển thành tệp chạy [exe] thì các tệp mã nguồn [tệp chứa ký tự chữ và số] được xào nấu qua 1 lần. VD: #define MAX 10 // Các chuỗi MAX 10 trong tệp mã nguồn được thay bằng số 10. [Không có ';' ở cuối #define]. #include cũng là một chỉ thị tiền biên dịch [Không nhầm là bắt đầu với #] nó nói cho tr
anon5203072 [anon5203072] October 30, 2018, 4:56am #3

Macro là phần riêng rẽ với C và có thể được dùng để search + replace text trong source code trước khi được đưa vào compiler để dịch, còn inline là keyword của ngôn ngữ, semantics của nó chặt chẽ hơn.

Việc dùng macro thực ra chỉ là Ctrl + V body của hàm đó lúc biên dịch, nếu bạn có biến a trong macro thì khi nó copy + paste vào đâu đó thì biến a cũng có ở đó, và nếu bạn có 1 biến a trước đó đã được định nghĩa thì biến a đó của bạn sẽ bị che [shadow]. Có thể dùng scope để che lại do { ... } \, nhưng đó là hack.

Inline thì an toàn hơn vì bạn có type safety, và vì nó cũng đưa function vào chỗ gọi lúc được gọi nhưng không phải kiểu copy + paste cả cục.

extern với static inline thì cũng hệt như extern với static nhưng nó là inline thôi.

2 Likes
rogp10 [rogp10] October 30, 2018, 6:25am #4
TrongDung:

Không phải lúc nào inline cũng được compiler thực hiện.

Nhiều khi là không đời nào luôn. //gcc.gnu.org/onlinedocs/gcc-4.0.4/gcc/Function-Attributes.html

1 Like

Video liên quan

Chủ Đề