Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

__func__ ใน C/C++: ดึงชื่อฟังก์ชันปัจจุบันสำหรับ Debug/Log

__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__

IdentifierStandardเนื้อหาCompiler Support
__func__C99, C++11Function Name เท่านั้นAll Modern
__FUNCTION__GNU Extensionเหมือน __func__GCC, Clang, MSVC
__PRETTY_FUNCTION__GNU ExtensionSignature เต็ม (Class, Template, Const, Ref)GCC, Clang
__FUNCSIG__MSVC ExtensionSignature เต็ม (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