मिनिमल कोड:क्या यह एक अनिर्धारित व्यवहार है जिसमें इनलाइन फ़ंक्शन की अलग-अलग परिभाषाएं हैं?
// --------inline.h--------
struct X {
static inline void foo();
};
#ifdef YES
inline void X::foo() { cout << "YES\n"; }
#else
inline void X::foo() { cout << "NO\n"; }
#endif
// --------file1.cpp--------
#define YES // <----
#include"inline.h"
void fun1()
{
X::foo();
}
// --------file2.cpp--------
#include"inline.h"
void fun2()
{
X::foo();
}
अगर हम कहते हैं fun1()
और fun2()
, तो वे YES
और NO
क्रमशः प्रिंट होगा, जिसका अर्थ है कि वे एक ही X::foo()
के विभिन्न समारोह निकायों बात कर रहे हैं।
इसके बावजूद इसे कोड किया जाना चाहिए या नहीं, मेरा प्रश्न है:
क्या यह एक अच्छी तरह परिभाषित या अपरिभाषित व्यवहार है?
यदि आप दो अलग-अलग फ़ाइलों में दो अलग-अलग फ़ंक्शंस (क्लास सदस्य नहीं) चाहते हैं लेकिन एक ही नाम के साथ, तो आप उन्हें 'स्थिर' कीवर्ड (या अज्ञात नामस्थान) से अलग कर सकते हैं। Stat2 के रूप में file2.cpp में फ़ंक्शन को चिह्नित करना मतलब है कि लिंक करने के दौरान कोई अन्य .cpp फ़ाइल इसे देख नहीं सकती है। यह बहुत बड़े कार्यक्रमों के लिए उपयोगी है जहां आप हमेशा यह सुनिश्चित नहीं कर सकते कि पहले से ही कार्यों द्वारा आम नाम क्या उठाए गए हैं। – Crashworks
आपको वास्तव में इनलाइन में hline.h और # परिभाषित हैक की आवश्यकता नहीं है; बस फ़ाइल 1.cpp में एक तरफ "शून्य एक्स :: foo()" (इनलाइन के साथ या बिना) परिभाषित करें, और दूसरा file2.cpp में, और आपके पास एक ही व्यवहार होगा। – abarnert
@abarnert: 'इनलाइन' परिणामों को एक परिभाषा नियम के एक अलग उल्लंघन में छोड़ना। गैर-इनलाइन फ़ंक्शंस 3.2 अनुच्छेद 3, 3.2 अनुच्छेद 5 द्वारा इनलाइन फ़ंक्शंस द्वारा कवर किए गए हैं। कई (अधिकांश?) लिंकर्स गैर-इनलाइन उल्लंघनों को पकड़ते हैं। मेरा कम से कम इनलाइन उल्लंघनों को पकड़ नहीं लेता है। –