__func__ เป็น Implicit Local Variable (ไม่ใช่ Macro) ที่ Compiler สร้างให้อัตโนมัติในแต่ละ Function เก็บชื่อฟังก์ชันเป็น String Literal (`static const char __func__[] = "function_name";`) มาตรฐาน C99 / C++11
คุณสมบัติ
- Type: `static const char[]` (Array of Char)
- Scope: Local ใน Function เท่านั้น
- Value: ชื่อฟังก์ชัน (Unqualified, ไม่มี Namespace/Class/Parameters)
- Standard: C99, C++11
ตัวอย่างพื้นฐาน
#include <stdio.h>
void testFunction() {
printf("Inside: %s\n", __func__);
}
int main() {
printf("Main: %s\n", __func__);
testFunction();
return 0;
}
ผลลัพธ์
Main: main
Inside: testFunction
Identifier คล้ายๆ กัน: __FUNCTION__ และ __PRETTY_FUNCTION__
| Identifier | Standard | เนื้อหา | Compiler Support |
|---|---|---|---|
__func__ | C99, C++11 | Function Name เท่านั้น | All Modern |
__FUNCTION__ | GNU Extension | เหมือน __func__ | GCC, Clang, MSVC |
__PRETTY_FUNCTION__ | GNU Extension | Signature เต็ม (Class, Template, Const, Ref) | GCC, Clang |
__FUNCSIG__ | MSVC Extension | Signature เต็ม (MSVC Format) | MSVC |
ตัวอย่าง __PRETTY_FUNCTION__
#include <iostream>
class MyClass {
public:
void method() const {
std::cout << __PRETTY_FUNCTION__ << '\n';
}
};
template <typename T>
void templateFunc(T) {
std::cout << __PRETTY_FUNCTION__ << '\n';
}
int main() {
std::cout << __PRETTY_FUNCTION__ << '\n';
MyClass().method();
templateFunc(42);
}
ผลลัพธ์ (GCC/Clang)
int main()
void MyClass::method() const
void templateFunc(T) [with T = int]
การประยุกต์ใช้: Logging Macro
#define LOG(msg) std::cerr << "[" << __func__ << "] " << msg << '\n'
void processData() {
LOG("Starting...");
// ...
LOG("Done");
}
ข้อจำกัด
- ไม่ใช่ Preprocessor Macro -> ไม่สามารถ `#ifdef __func__` ได้
- ไม่รวม Namespace, Class Name (ใช้
__PRETTY_FUNCTION__แทน) - ใน Lambda: GCC/Clang ให้ `
`, MSVC ให้ `operator()`
สรุป
__func__ เป็น Standard Way เพื่อได้ชื่อฟังก์ชันปัจจุบัน สำหรับ Logging/Debugging ใช้ __PRETTY_FUNCTION__ (GCC/Clang) หรือ __FUNCSIG__ (MSVC) หากต้องการ Signature เต็ม รวม Template/Const/Ref Qualifiers