Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C/C++ में __PRETTY_FUNCTION__, __FUNCTION__, __func__ में क्या अंतर है?

फ़ंक्शन नाम आइडेंटिफायर्स

यहां हम __FUNCTION__, __func__ और __PRETTY_FUNCTION__ के बीच अंतर देखेंगे।

मूल रूप से __FUNCTION__ और __func__ समान हैं। C और C++ के कुछ पुराने संस्करण __func__ का समर्थन करते हैं। यह मैक्रो वर्तमान फ़ंक्शन का नाम प्राप्त करने के लिए उपयोग किया जाता है। __PRETTY_FUNCTION__ फ़ंक्शन के बारे में विवरण वापस करने के लिए उपयोग किया जाता है। इसका उपयोग करके हम प्राप्त कर सकते हैं कि कौन सा फ़ंक्शन उपयोग किया गया है, और यह किस क्लास से संबंधित है, आदि।

उदाहरण

#include <iostream>
using namespace std;

class MyClass {
public:
    void Class_Function() {
        cout << "The result of __PRETTY_FUNCTION__: " << __PRETTY_FUNCTION__ << endl;
    }
};

void TestFunction() {
    cout << "Output of __func__ is: " << __func__ << endl;
}

int main() {
    cout << "Output of __FUNCTION__ is: " << __FUNCTION__ << endl;
    TestFunction();
    MyClass myObj;
    myObj.Class_Function();
    return 0;
}

आउटपुट (GCC/Clang)

Output of __FUNCTION__ is: main
Output of __func__ is: TestFunction
The result of __PRETTY_FUNCTION__: void MyClass::Class_Function()

तुलना तालिका

आइडेंटिफायरस्टैंडर्डकंटेंटउदाहरण आउटपुट
__func__C99, C++11केवल फ़ंक्शन नाम"main"
__FUNCTION__GCC/MSVC एक्सटेंशनकेवल फ़ंक्शन नाम"main"
__PRETTY_FUNCTION__GCC/Clang एक्सटेंशनपूर्ण सिग्नेचर"void MyClass::Class_Function()"
__FUNCSIG__MSVC एक्सटेंशनपूर्ण सिग्नेचर (MSVC स्टाइल)"void __cdecl MyClass::Class_Function(void)"

व्यावहारिक उपयोग

लॉगिंग मैक्रो

// पोर्टेबल बेसिक लॉगिंग
#define LOG(msg) std::cerr << "[" << __func__ << "] " << msg << '\n'

// GCC/Clang पर विस्तृत लॉगिंग
#if defined(__GNUC__) || defined(__clang__)
#define DETAILED_LOG(msg) std::cerr << "[" << __PRETTY_FUNCTION__ << "] " << msg << '\n'
#else
#define DETAILED_LOG(msg) LOG(msg)
#endif

void processData(int id) {
    LOG("Processing started");
    DETAILED_LOG("Processing with ID");
    // ...
}

एरर मैसेजेस में

void validateInput(int value) {
    if (value < 0) {
        throw std::invalid_argument(
            std::string(__func__) + ": value must be non-negative, got " + 
            std::to_string(value)
        );
    }
}

नोट्स

  • __func__ एक वेरिएबल है (मैक्रो नहीं) - static const char __func__[] = "function-name";
  • __PRETTY_FUNCTION__ कंपाइलर-विशिष्ट है - पोर्टेबल कोड के लिए __func__ पसंद करें
  • इनलाइन फ़ंक्शन्स और टेम्पलेट्स के साथ, आउटपुट कंपाइलर के बीच भिन्न हो सकता है
  • C++20 std::source_location एक स्टैंडर्ड विकल्प प्रदान करता है

C++20 std::source_location

#include <source_location>
#include <iostream>

void log(const std::string& msg, 
         const std::source_location& loc = std::source_location::current()) {
    std::cerr << "[" << loc.function_name() << ":" << loc.line() << "] " << msg << '\n';
}

void foo() {
    log("Hello from foo");  // स्वचालित रूप से foo और लाइन नंबर कैप्चर करता है
}
  1. - लिनक्स पर C++ के लिए सर्वश्रेष्ठ IDE कौन सा है?

    बड़े प्रोजेक्ट्स को केवल टेक्स्ट एडिटर्स पर प्रबंधित करना मुश्किल होता है। ऐसे मामलों में IDE का उपयोग करने से आप अधिक उत्पादक और कम निराश होंगे। विभिन्न प्रकार के IDE उपलब्ध हैं और आपको अपनी आवश्यकताओं के अनुरूप सही चुनना चाहिए। लिनक्स पर C++ के लिए कोई एक सर्वश्रेष्ठ IDE नहीं है; आपको अपने टूल को

  1. - लिनक्स पर C++ के लिए शीर्ष IDE

    बड़े प्रोजेक्ट्स को केवल टेक्स्ट एडिटर्स पर प्रबंधित करना मुश्किल होता है। ऐसे मामलों में IDE का उपयोग करने से आप अधिक उत्पादक और कम निराश होंगे। विभिन्न प्रकार के IDE उपलब्ध हैं और आपको अपनी आवश्यकताओं के अनुरूप सही चुनना चाहिए। यहां लिनक्स के लिए सर्वश्रेष्ठ C/C++ IDEs की सूची दी गई है। NetBeans

  1. - विंडोज पर C++ के लिए शीर्ष IDE

    बड़े प्रोजेक्ट्स को केवल टेक्स्ट एडिटर्स पर प्रबंधित करना मुश्किल होता है। ऐसे मामलों में IDE का उपयोग करने से आप अधिक उत्पादक और कम निराश होंगे। विभिन्न प्रकार के IDE उपलब्ध हैं और आपको अपनी आवश्यकताओं के अनुरूप सही चुनना चाहिए। यहां विंडोज के लिए सर्वश्रेष्ठ C/C++ IDEs की सूची दी गई है। Visual S