निम्नलिखित कोड का टुकड़ा (सही) सी में सी में एक चेतावनी और त्रुटि देता ++ (का उपयोग कर जीसीसी & जी ++ क्रमश संस्करणों 3.4.5 और 4.2.1 के साथ परीक्षण किया; MSVC देखभाल करने के लिए प्रतीत नहीं होता है):मैं सी में 'char **' को 'const char * const *' में क्यों परिवर्तित नहीं कर सकता?
char **a;
const char** b = a;
मैं इसे समझ और स्वीकार कर सकता हूं।
इस समस्या का सी ++ समाधान बी को एक कॉन्स char * const * के रूप में बदलने के लिए है, जो पॉइंटर्स के पुन: असाइनमेंट को अस्वीकार करता है और आपको कॉन्स्ट-शुद्धता (C++ FAQ) को रोकने से रोकता है।
char **a;
const char* const* b = a;
हालांकि, शुद्ध सी में, सही संस्करण (स्थिरांक चार * स्थिरांक * का प्रयोग करके) अभी भी एक चेतावनी देता है, और मैं क्यों समझ में नहीं आता। क्या कलाकारों का उपयोग किये बिना इसे पाने का कोई तरीका है?
स्पष्टीकरण के लिए:
1) यह सी में चेतावनी क्यों उत्पन्न करता है? यह पूरी तरह से कॉन्स्ट-सुरक्षित होना चाहिए, और सी ++ कंपाइलर इसे इस तरह पहचानने लगता है।
2) इस char ** को पैरामीटर के रूप में स्वीकार करने के बारे में जाने का सही तरीका क्या है (और संकलक लागू करने के बाद) कि मैं वर्णों को संशोधित नहीं करूँगा? उदाहरण के लिए, अगर मैं एक समारोह लिखना चाहते थे:
void f(const char* const* in) {
// Only reads the data from in, does not write to it
}
और मैं, एक चार ** पर यह आह्वान क्या पैरामीटर के लिए सही प्रकार होगा करना चाहते थे?
संपादित करें: उन लोगों के लिए धन्यवाद जिन्होंने जवाब दिया है, विशेष रूप से जिन्होंने प्रश्नों को संबोधित किया और/या मेरे जवाबों का पालन किया।
मैंने जवाब स्वीकार कर लिया है कि मैं जो करना चाहता हूं उसे बिना किसी कलाकार के किया जा सकता है, भले ही यह संभव हो या नहीं।
मैं आपके प्रश्न के रूप में उलझन में हूं, यह है: "मैं मुझे चेतावनी देने के लिए सी कैसे प्राप्त करूं?" या यह है "मैं एक संकलन त्रुटि फेंकने के लिए सी ++ कैसे प्राप्त करूं?" या शायद यह इनमें से कोई नहीं है। – user7116
मैं छः पत्रिकाओं के साथ सहमत हूं, इस प्रश्न को और स्पष्टीकरण की आवश्यकता है। –
सवाल यह है कि "मैं क्यों नहीं बदल सकता 'char **' to 'char * const *?" – Kevin