Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Định danh __func__ trong C

__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 danhChuẩnNội dungVí dụ
__func__C99, C++11Tên hàm đơn giản"main"
__FUNCTION__GCC/MSVC extensionTên hàm đơn giản"main"
__PRETTY_FUNCTION__GCC/Clang extensionChữ 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)