เรารู้ว่า Macro ใน C/C++ ไม่มีการตรวจสอบชนิดข้อมูล (type checking) Macro รับอาร์กิวเมนต์ชนิดใดก็ได้ ตัวอย่างต่อไปนี้แสดงปัญหานี้ชัดเจน
ตัวอย่าง Macro ปกติ
#include <stdio.h>
#define INCREMENT(X) ++X
int 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));
}
ผลลัพธ์
Integer Increment: 6 Float Increment: 3.560000 Character Increment: B
นี่คือปัญหาของ Macro ในรุ่นใหม่ของ C สามารถใช้คีย์เวิร์ด _Generic เพื่อกำหนด macro ให้ทำงานต่างกันตามชนิดข้อมูล มาดูตัวอย่าง
ตัวอย่างใช้ _Generic
#include <stdio.h>
#define INCREMENT(X) _Generic((X), \
char: X + 10, \
int: X + 1, \
float: X + 2.5, \
default: 0)
int 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));
}
ผลลัพธ์
Integer Increment: 6 Float Increment: 5.060000 Character Increment: K