ใน C ไม่สามารถพิมพ์ชื่อตัวแปรได้โดยตรง เพราะชื่อตัวแปรหายไปหลังคอมไพล์ (Compile-time) แต่สามารถทำได้ด้วย Stringification Operator (#) ใน Preprocessor Macro
เทคนิค Stringification (# Operator)
ตัวดำเนินการ # ใน Macro จะแปลง Token ให้กลายเป็น String Literal
ตัวอย่าง
#include <stdio.h>
// Macro ที่รับชื่อตัวแปรและแปลงเป็น String
#define VariableName(name) #name
int main() {
int name;
char ch;
printf("The variable name : %s", VariableName(name));
printf("\nThe variable name : %s", VariableName(ch));
return 0;
}
ผลลัพธ์
The variable name : name
The variable name : ch
คำอธิบาย
#define VariableName(name) #name- Macro นี้รับ parameternameและนำ#มาแปลงเป็น StringVariableName(name)ขยายเป็น"name"VariableName(ch)ขยายเป็น"ch"
การประยุกต์ใช้: Debug Macro
#include <stdio.h>
// Macro สำหรับ Debug: พิมพ์ชื่อตัวแปรและค่า
#define PRINT_VAR(x) printf(#x " = %d\n", x)
int main() {
int a = 10, b = 20;
float pi = 3.14f;
PRINT_VAR(a); // a = 10
PRINT_VAR(b); // b = 20
// PRINT_VAR(pi); // Warning: format %d แต่เป็น float
return 0;
}
ข้อจำกัด
- ทำงานได้เฉพาะ Compile-time - ต้องรู้ชื่อตัวแปรขณะเขียนโค้ด
- ไม่สามารถใช้กับตัวแปรที่สร้างขึ้นใน Runtime (Dynamic) ได้
- ไม่ทำงานกับ Pointer/Array decay (ชื่อตัวแปรอาร์เรย์จะ decay เป็น pointer)
เทคนิคขั้นสูง: Token Pasting (##)
#define DECLARE_AND_PRINT(type, name) \
type name = 0; \
printf(#name " = %d\n", name)
int main() {
DECLARE_AND_PRINT(int, myVar); // สร้าง int myVar = 0; printf("myVar = %d\n", myVar);
return 0;
}
สรุป
การพิมพ์ชื่อตัวแปรใน C ทำได้ผ่าน Preprocessor Stringification (#) เท่านั้น ซึ่งมีข้อจำกัดมาก ใช้เหมาะสำหรับ Debugging Macros หรือ Code Generation ไม่ใช่สำหรับ Reflection ใน Runtime