मैं इनलाइन फ़ंक्शंस के बारे में पढ़ रहा था और विभिन्न अनुवाद इकाइयों में उनकी कई परिभाषाएँ कैसे हो सकती हैं, लेकिन वे परिभाषाएँ समान होनी चाहिए।

तो मैं जो सोच रहा था वह यह है कि अगर मैंने हेडर फ़ाइल में एक फ़ंक्शन घोषित किया और इसे 2 सीपीपी फाइलों में परिभाषित किया क्योंकि इनलाइन संकलक नाराज नहीं होगा।

तो मैंने निम्नानुसार करने की कोशिश की:

global.h

#ifndef DRAKOS_GLOBAL_H
#define DRAKOS_GLOBAL_H

#include <iostream>
void fct();

#endif //DRAKOS_GLOBAL_H

file1.cpp

#include "global.h"

inline void  fct()
{
    std::cout << "file1.cpp \n";
}

main.cpp

#include "global.h"

extern void fct();

int main()
{
    fct();
}

निर्माण ---> त्रुटि:

'fct ()' के लिए अपरिभाषित संदर्भ

ठीक है मैंने Google में चारों ओर देखा और मैंने उसे पढ़ा

यह अनिवार्य है कि फ़ंक्शन की परिभाषा को हेडर फ़ाइल में रखा जाए, जब तक कि फ़ंक्शन का उपयोग केवल एक .cpp फ़ाइल में न किया जाए।

अब तक सब कुछ स्पष्ट और तर्कपूर्ण है, लेकिन सवाल यह है कि क्या मैं हेडर फाइल में परिभाषा डालूं; प्रत्येक टीयू की एक ही परिभाषा होगी, मैं इनलाइन फ़ंक्शन के दो संस्करणों को परिभाषित नहीं कर पाऊंगा, एक फ़ाइल 1.cpp TU में और दूसरा main.cpp TU में।

तो प्रश्न १: वे क्यों कहते हैं, कि एक इनलाइन फ़ंक्शन के लिए, अलग-अलग टीयू में कई परिभाषाएं हो सकती हैं, लेकिन समान होनी चाहिए (जैसे कि मैं हेडर में परिभाषा डालता हूं, यह सीपीपी फ़ाइल में अलग होगा और नहीं कर सकता)

प्रश्न २: यदि ऐसा करना संभव है और एक इनल्ड फ़ंक्शन की कई परिभाषाओं को परिभाषित करें (मेरी तरफ से समझने में चूक के कारण) तो क्या कोई मुझे एक आसान उदाहरण दिखा सकता है :)

अग्रिम में धन्यवाद

-1
Blood-HaZaRd 12 जून 2019, 00:56

1 उत्तर

सबसे बढ़िया उत्तर

यह कोड नियम C++17 [dcl.inline]/6 के कारण अपरिभाषित व्यवहार (कोई निदान आवश्यक नहीं) का कारण बनता है:

[...] यदि बाहरी लिंकेज के साथ एक फ़ंक्शन या चर को एक अनुवाद इकाई में इनलाइन घोषित किया जाता है, तो इसे सभी अनुवाद इकाइयों में इनलाइन घोषित किया जाएगा जिसमें यह दिखाई देता है; कोई निदान की आवश्यकता नहीं है।

आपने fct को file1.cpp में इनलाइन घोषित किया है लेकिन main.cpp में नहीं।

साथ ही आपके पास main.cpp में fct की कोई परिभाषा नहीं है। आप main.cpp (और प्रोजेक्ट में हर दूसरे .cpp) में कॉपी और पेस्ट कर सकते हैं:

inline void  fct()
{
    std::cout << "file1.cpp \n";
}

लेकिन यह बुरा अभ्यास होगा क्योंकि गलती से किसी एक फ़ंक्शन को बदलना या .cpp फ़ाइल को भूल जाना आसान हो जाएगा। इसे हेडर फाइल में रखने से इस समस्या से बचा जा सकता है।

2
M.M 12 जून 2019, 02:11