नहीं - यह कभी नहीं करें!
यह असंभव है, आपको आकस्मिक दुर्घटनाएं होने की संभावना है।
एक ही तरीका है इसे सही ढंग से किया जाना नाम स्थान नाम उपयोग कर रहा है: अर्थात विकल्प बढ़ावा संस्करण में अलग नाम स्थान रखा पैदा करते हैं।
बीसीपी का नवीनतम संस्करण इस विकल्प को प्रदान करता है। तो आप बूस्ट के बजाय boost_1_43 जैसे कुछ का उपयोग करेंगे। लेकिन यह आपके लिए काफी पारदर्शी होगा। लेकिन आपको अभी भी पता होना चाहिए कि आप उसी सीपीपी फ़ाइल में बूस्ट के दो संस्करणों का उपयोग नहीं कर सकते हैं।
इसके अलावा इस चर्चा पर एक नज़र डालें: Creating Library with backward compatible ABI that uses Boost
पसंद आया स्क्रिप्ट नाम स्थान का नाम बदलता है, को परिभाषित करता है और इसलिए शामिल आप वास्तव में
#include <boost/foo.hpp>
#include <myboost/bar.hpp>
boost::foo f;
myboost::bar b;
बूस्ट बीसीपी इस की अनुमति नहीं है
की तरह बढ़ावा के दो संस्करणों शामिल कर सकते हैं ।
लेकिन फिर भी आपको सावधान रहना चाहिए के रूप में कुछ पुस्तकालयों के बिना बढ़ावा उपसर्ग extern "सी" प्रतीकों निर्यात करते हैं, को बढ़ावा देने :: धागा और बढ़ावा देने :: regex के सी एपीआई (regexec, regcomp)
संपादित
इस तरह के मुद्दे के उदाहरण के रूप में निम्न फ़ाइलें बनाएँ:
a.cpp:
template<typename Foo>
Foo add(Foo a, Foo b)
{
return a+b;
}
int foo(int x,int y)
{
return add(x,y);
}
b.cpp:
template<typename Foo>
Foo add(Foo a, Foo b)
{
return a-b;
}
int bar(int x,int y)
{
return add(x,y);
}
परीक्षण।सीपीपी:
#include <iostream>
int foo(int,int);
int bar(int,int);
int main()
{
std::cout<< foo(10,20) <<" " <<bar(10,20) << std::endl;
}
उन्हें संकलित करें:
g++ a.cpp b.cpp test.cpp
आप उम्मीद करेंगे:
30 -10
लेकिन आप
30 30
या
मिलेगा
-10 -10
लिंकिंग ऑर्डर के आधार पर।
तो दो बढ़ावा संस्करणों का उपयोग कर आप गलती से अन्य को बढ़ावा देने से संकेतों का इस्तेमाल इस कार्यक्रम प्रतीक int add<int>(int,int)
में के रूप में ही क्रैश हो सकता है अगर यह अलग संकलन इकाइयों में रखा गया है एक ही प्रतीक भी का संकल्प लिया है।
लिंक के लिए +1 - भले ही मैं आपके उत्तर के पहले भाग से असहमत हूं। – richj
@richj - यह डीएलएल प्लेटफ़ॉर्म के तहत संभव है जहां सभी लिंक स्पष्ट हैं, लेकिन ईएलएफ बुरी चीजें होती हैं (अनुभव से) – Artyom