Chúng ta biết Macro được dùng trong C hoặc C++, nhưng không có cơ chế kiểm tra kiểu. Macro có thể nhận bất kỳ loại đối số nào. Ví dụ sau sẽ cho thấy trường hợp này rõ ràng.
Ví dụ
#include<stdio.h>
#define INCREMENT(X) ++X
main() {
int x = 5; float y = 2.56; char z = 'A';
printf("Integer Increment: %d\n", INCREMENT(x));
printf("Float Increment: %f\n", INCREMENT(y));
printf("Character Increment: %c\n", INCREMENT(z));
}Kết quả
Integer Increment: 6 Float Increment: 3.560000 Character Increment: B
Đó là vấn đề của macro. Trong phiên bản sau của C, chúng ta có thể dùng macro bằng từ khóa '_Generic'. Sử dụng này chúng ta có thể định nghĩa macro với nhiều kiểu dữ liệu khác nhau. Hãy xem một ví dụ.
Ví dụ
#include<stdio.h>
#define INCREMENT(X) _Generic( (X), char: X+10, int: X+1, float: X+2.5, default: 0)
main() {
int x = 5; float y = 2.56; char z = 'A';
printf("Integer Increment: %d\n", INCREMENT(x));
printf("Float Increment: %f\n", INCREMENT(y));
printf("Character Increment: %c\n", INCREMENT(z));
}Kết quả
Integer Increment: 6 Float Increment: 5.060000 Character Increment: K