__func__ là định danh (identifier) được chuẩn C99 định nghĩa ngầm trong mỗi hàm, chứa tên của hàm hiện tại dưới dạng chuỗi ký tự tĩnh. Tương tự __FUNCTION__ (extension GCC/MSVC) và __PRETTY_FUNCTION__ (GCC/Clang - chi tiết hơn).
Đặc điểm
- Kiểu:
static const char __func__[] - Giá trị: Tên hàm (không bao gồm tham số, kiểu trả về)
- Phạm vi: Chỉ trong thân hàm
- Không phải macro (không dùng
#define)
Ví dụ cơ bản
#include <stdio.h>
void TestFunction() {
printf("Ten ham: %s\n", __func__);
}
int main() {
printf("Ten ham: %s\n", __func__); // "main"
TestFunction(); // "TestFunction"
return 0;
}
Kết quả
Ten ham: main Ten ham: TestFunction
So sánh: __func__ vs __FUNCTION__ vs __PRETTY_FUNCTION__
| Định danh | Chuẩn | Nội dung | Ví dụ |
|---|---|---|---|
__func__ | C99, C++11 | Tên hàm đơn giản | "main" |
__FUNCTION__ | GCC/MSVC extension | Tên hàm đơn giản | "main" |
__PRETTY_FUNCTION__ | GCC/Clang extension | Chữ ký đầy đủ | "void MyClass::func(int)" |
Ví dụ với class (C++)
#include <iostream>
class MyClass {
public:
void ClassMethod() {
std::cout << "__func__: " << __func__ << '\n';
std::cout << "__PRETTY_FUNCTION__: " << __PRETTY_FUNCTION__ << '\n';
}
};
void TestFunction() {
std::cout << "__func__: " << __func__ << '\n';
}
int main() {
std::cout << "__func__: " << __func__ << '\n';
TestFunction();
MyClass obj;
obj.ClassMethod();
}
Kết quả
__func__: main __func__: TestFunction __func__: ClassMethod __PRETTY_FUNCTION__: void MyClass::ClassMethod()
Ứng dụng thực tế: Logging/Debug
#include <iostream>
#include <string>
#define LOG(msg) std::cerr << "[" << __func__ << "] " << msg << '\n'
void processData(int id) {
LOG("Bat dau xu ly ID: " + std::to_string(id));
// ...
LOG("Hoan tat");
}
int main() {
processData(42);
}
Kết quả
[processData] Bat dau xu ly ID: 42 [processData] Hoan tat
Tóm tắt
__func__: Chuẩn C99/C++11, portable, chỉ tên hàm__PRETTY_FUNCTION__: GCC/Clang, có chữ ký đầy đủ (class, template, const...)- Dùng cho logging, debug, profiling, error reporting
- Không tốn chi phí runtime (compile-time constant)