Macro dạng hàm (function-like macro) trong C có dạng #define TÊN(P1,P2,...,Pk) THÂN, trong đó THÂN là một dãy token; khi gặp lời gọi TÊN(a1,a2,...,ak) trong mã nguồn, trình tiền xử lý thay lời gọi bằng THÂN sau khi thay mỗi tham số hình thức Pi xuất hiện trong THÂN bằng đối số thực ai tương ứng (thay tất cả các lần xuất hiện của Pi trong THÂN, nguyên vẹn cả token, không thay chuỗi con).
Cho n định nghĩa macro dạng hàm và m dòng mã nguồn, với quy ước: trong dòng mã nguồn, mọi token có dạng TÊN(a1,a2,...,ak) (không chứa khoảng trắng bên trong, các đối số cách nhau bởi dấu phẩy, mỗi đối số là một token đơn không chứa dấu phẩy hoặc ngoặc) mà TÊN trùng với tên một macro đã định nghĩa và số đối số đúng bằng số tham số hình thức, được xem là một lời gọi macro và được thay thế; các token khác giữ nguyên (kể cả khi trông giống lời gọi nhưng TÊN không phải macro hoặc số đối số không khớp). Việc thay thế chỉ thực hiện một lượt (không xử lý lời gọi macro lồng bên trong THÂN sau khi thay).
Ví dụ: Với macro MAX(a,b) = ( a > b ? a : b ) và dòng code r = MAX(x,y), kết quả là r = ( x > y ? x : y ).
TÊN(P1,P2,...,Pk)=THÂN, trong đó phần tham số hình thức không chứa khoảng trắng (TÊN(P1,P2,...,Pk), k≥0; nếu k=0 thì viết TÊN()), theo sau là dấu = rồi đến THÂN là các token cách nhau bởi đúng một khoảng trắng (THÂN có thể rỗng — không có token nào sau dấu =, khi đó sau = là hết dòng).In ra m dòng mã nguồn sau khi thay thế lời gọi macro (giữ nguyên các token không phải lời gọi macro hợp lệ), token trong THÂN đã thay thế cũng cách nhau bởi đúng một khoảng trắng.
Ví dụ:
Đầu vào:
1 1
FOO(a)=a + 1
call = FOO(x,y)
Đầu ra:
call = FOO(x,y)
Đầu vào:
1 1
MAX(a,b)=( a > b ? a : b )
r = MAX(x,y)
Đầu ra:
r = ( x > y ? x : y )
Đang tải editor...