गलती से, मैं निम्नलिखित दिलचस्प टुकड़ा लिखा है:अजीब व्यवहार
#include <iostream>
#include <cstring>
size_t strlen(const char* str) {
std::cout << "hello";
return 0;
}
int main() {
return std::strlen("sdf");
}
अनपेक्षित रूप से मेरे लिए, उत्पादन "हैलो" जीसीसी 5.1 है, जो कि मेरे strlen
बुलाया जा रहा है इसका मतलब है। और भी दिलचस्प, अगर मैं return
हटा देता हूं, यानी std::strlen("sdf");
की कॉल के साथ मुख्य स्थानांतरित करें, तो कुछ भी मुद्रित नहीं होता है!
मैं भी बजना, जिसके लिए std::strlen
असली समारोह जो स्ट्रिंग की लंबाई की गणना करता है (और कुछ भी नहीं मुद्रित हो जाता है) कॉल करने की कोशिश की। यही वह है जो मुझे देखने की उम्मीद थी।
यह कैसे समझाया जा सकता है? क्या मेरा खुद का strlen
फ़ंक्शन परिभाषित करना अनिर्धारित व्यवहार माना जाता है?
[आरक्षित.नाम] और [depr.c.headers] देखें। –
मेरी मशीन पर आपका उदाहरण segfaults। (लिनक्स, जीसीसी-संस्करण 6.2.1 20160830) मुझे इसकी उम्मीद नहीं थी। मुझे कोड "हैलो" प्रिंट करने और ऑपरेटिंग सिस्टम में कोड 0 से बाहर निकलने की उम्मीद थी। – DusteD
मुझे आपके उदाहरण (जीसीसी 5.4) के साथ एक सेगफॉल्ट भी मिलता है। मैं सुझाव दूंगा कि वैश्विक नामस्थान में 'स्ट्रेलन' फ़ंक्शन प्रदान करने के लिए यह बेहद असामान्य और "जोखिम भरा" है, क्योंकि यदि आपने स्वाभाविक रूप से ' 'पहले शामिल किया है, तो वह libc संस्करण (" सी "लिंकेज के साथ) को ओवरराइड करेगा। 'std :: strlen' को ओवरराइड करता है, जिसे लाइब्रेरी में कहीं और इस्तेमाल किया जा सकता है। उदाहरण के लिए। 'std :: cout' 'strlen' पर कॉल उत्पन्न करता प्रतीत होता है। –
davmac