C ++ 17 में आरंभीकरण के बाद एक इनलाइन चर को बदला जा सकता है?


11

मेरा परिदृश्य निम्नलिखित है (यह क्लैग में काम किया है लेकिन जीसीसी में नहीं)

liba.hpp:

inline int MY_GLOBAL = 0;

libother.cpp: (dll)

#include "myliba.hpp"

void myFunc() {
    //
    MYGLOBAL = 28;
}

someexe.cpp:

RunAppThatUsesBothLibAandLibOther();

समस्या यह है कि इनलाइन वैरिएबल 0 को उन जगहों पर दिखा रहा था जहां मुझे 28 की उम्मीद थी क्योंकि यह रन-टाइम में संशोधित किया गया था। MSVC इससे सहमत नहीं है, लेकिन क्लैग वह बात करता है जिसकी मुझे उम्मीद थी।

सवाल यह है कि क्या मेरे परिदृश्य में इनलाइन चरों को रन-टाइम में संशोधित किया जा सकता है? (मैंने वैरिएबल को डी-इनलाइन करके समस्या हल की है।)

जवाबों:


10

हाँ, inlineचर को आरंभीकरण के बाद संशोधित किया जा सकता है।

हालाँकि, MSL के साथ विंडोज पर DLL अजीब चीजें हैं। एक निकट सन्निकटन के लिए, प्रत्येक DLL को पूरी तरह से स्वतंत्र रनटाइम के साथ अपने C ++ प्रोग्राम के रूप में मॉडलिंग की जाती है। इसलिए, inlineमुख्य कार्यक्रम के लिए आपके चर की एक प्रति है , और DLL के लिए एक और है।


1
समान कैवेट एम्प्टर : दो डीएलएल में एक ही स्टैटिक लीब को जोड़ने (जो कि आप फिर उसी प्रोग्राम से लिंक करते हैं) सभी स्टैटिक लिबर वैरिएबल की दो कॉपी तैयार करेंगे।
मैक्स लैंगहॉफ

इसका मतलब होगा, मेरा अनुमान है कि मुझे गैर-इनलाइन चर का उपयोग करना चाहिए। क्या ये सही है? कम से कम कई dll के मामले में जहां मैं रनटाइम में बदले गए मान को साझा करना चाहता हूं ...
जर्मेन डायगो

1
हां, आपको गैर- inlineचर का उपयोग करने की आवश्यकता होगी । आपको यह सुनिश्चित करने की भी आवश्यकता होगी कि उन्हें एक डीएलएल से निर्यात किया गया था और अन्य सभी जगहों से आयात किया गया था।
एंथनी विलियम्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.