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

C++ में __FILE__, __LINE__, और __FUNCTION__ क्या हैं

प्रीडिफाइंड मैक्रोज़ फॉर डिबगिंग

ये विशेष मैक्रोज़ कंपाइलर द्वारा प्रदान किए जाते हैं और डिबगिंग, लॉगिंग, और डायग्नोस्टिक्स के लिए उपयोगी होते हैं।

__FILE__ मैक्रो

यह मैक्रो वर्तमान फाइल का पथ प्राप्त करने के लिए उपयोग किया जाता है। यह तब उपयोगी होता है जब हम लॉग फाइल्स जनरेट करना चाहते हैं।

उदाहरण

#include <iostream>
using namespace std;

int errorLog(const char* file, const string& msg) {
    cerr << "[" << file << "] " << msg << endl;
    return 0;
}

#define LOG(msg) errorLog(__FILE__, msg)

int main() {
    LOG("This is a dummy error");
    return 0;
}

आउटपुट

[D:\Misc C and C++ Questions\test_prog.cpp] This is a dummy error

__LINE__ मैक्रो

यह मैक्रो सोर्स फाइल में वर्तमान लाइन नंबर ढूंढ सकता है। यह लाइन नंबर एक इंटीजर वैल्यू है। जब लॉग स्टेटमेंट्स जनरेट हो रहे होते हैं तो __LINE__ उपयोगी भूमिका निभाता है।

उदाहरण

#include <iostream>
using namespace std;

int errorLog(int line, const string& msg) {
    cerr << "[" << line << "] " << msg << endl;
    return 0;
}

#define LOG(msg) errorLog(__LINE__, msg)

int main() {
    LOG("This is a dummy error");
    return 0;
}

आउटपुट

[12] This is a dummy error

__FUNCTION__ मैक्रो

यह मैक्रो वर्तमान फ़ंक्शन का नाम वापस कर सकता है। जब लॉग स्टेटमेंट्स जनरेट हो रहे होते हैं तो __FUNCTION__ उपयोगी भूमिका निभाता है।

उदाहरण

#include <iostream>
using namespace std;

int errorLog(const char* func, const string& msg) {
    cerr << "[" << func << "] " << msg << endl;
    return 0;
}

#define LOG(msg) errorLog(__FUNCTION__, msg)

void TestFunction() {
    LOG("Send from Function");
}

int main() {
    TestFunction();
    LOG("This is a dummy error");
    return 0;
}

आउटपुट

[TestFunction] Send from Function
[main] This is a dummy error

संयुक्त लॉगिंग मैक्रो

#include <iostream>
#include <string>
using namespace std;

#define LOG(msg) \
    std::cerr << "[" << __FILE__ << ":" << __LINE__ << " " << __FUNCTION__ << "] " << msg << '\n'

void processData() {
    LOG("Starting processing");
    // ...
    LOG("Processing complete");
}

int main() {
    LOG("Program started");
    processData();
    LOG("Program ended");
    return 0;
}

आउटपुट

[test.cpp:25 main] Program started
[test.cpp:18 processData] Starting processing
[test.cpp:20 processData] Processing complete
[test.cpp:27 main] Program ended

C++20: std::source_location (मॉडर्न विकल्प)

#include <source_location>
#include <iostream>
#include <string>

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

void processData() {
    log("Processing...");  // स्वचालित कैप्चर
}

int main() {
    log("Start");
    processData();
    log("End");
    return 0;
}

मैक्रो तुलना

मैक्रोटाइपकंटेंटस्टैंडर्ड
__FILE__स्ट्रिंग लिटरलवर्तमान फाइल पथC89, C++98
__LINE__इंटीजरवर्तमान लाइन नंबरC89, C++98
__FUNCTION__स्ट्रिंग/वेरिएबलवर्तमान फ़ंक्शन नामC99, C++11 (GCC/MSVC एक्सटेंशन)
__func__स्थैतिक चरवर्तमान फ़ंक्शन नामC99, C++11
__PRETTY_FUNCTION__स्ट्रिंगसुंदर सिग्नेचरGCC/Clang एक्सटेंशन
  1. - C++ में वेरिएबल्स और उनके प्रकार क्या हैं?

    एक वेरिएबल हमें नामित स्टोरेज प्रदान करता है जिसे हमारे प्रोग्राम मैनिपुलेट कर सकते हैं। C++ में प्रत्येक वेरिएबल का एक विशिष्ट प्रकार होता है, जो वेरिएबल की मेमोरी के आकार और लेआउट को निर्धारित करता है; उस मेमोरी में संग्रहीत किए जा सकने वाले मानों की सीमा; और वेरिएबल पर लागू किए जा सकने वाले ऑपरे

  1. - C++ में cin, cout और cerr स्ट्रीम्स क्या हैं?

    cin, cout, cerr, और clog वे स्ट्रीम्स हैं जो स्टैंडर्ड इनपुट और स्टैंडर्ड आउटपुट को संभालते हैं। ये iostream हेडर फ़ाइल में परिभाषित स्ट्रीम ऑब्जेक्ट्स हैं। std::cin istream क्लास का एक ऑब्जेक्ट है जो संकीर्ण वर्णों (प्रकार char) के लिए उन्मुख स्टैंडर्ड इनपुट स्ट्रीम को दर्शाता है। यह C स्ट्रीम std

  1. - C++ में साइन्ड और अनसाइन्ड कीवर्ड्स

    C++ में सभी नंबर टाइप्स या तो साइन वाले हो सकते हैं या नहीं। उदाहरण के लिए, आप एक int घोषित कर सकते हैं जो केवल पॉजिटिव इंटीजर्स को दर्शाता है। जब तक अन्यथा निर्दिष्ट न हो, सभी इंटीजर डेटा टाइप्स साइन्ड डेटा टाइप्स होते हैं, यानी उनके मान पॉजिटिव या नेगेटिव हो सकते हैं। अनसाइन्ड कीवर्ड का उपयोग बिना