সি ++ 17-তে প্রাথমিককরণের পরে কোনও ইনলাইন ভেরিয়েবল পরিবর্তন করা যেতে পারে?


11

আমার পরিস্থিতি নিম্নরূপ (এটি ঝাঁকুনিতে কাজ করেছে তবে জিসিসিতে নয়)

liba.hpp:

inline int MY_GLOBAL = 0;

libother.cpp: (dll)

#include "myliba.hpp"

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

someexe.cpp:

RunAppThatUsesBothLibAandLibOther();

সমস্যাটি হ'ল ইনলাইন ভেরিয়েবলটি এমন জায়গাগুলিতে 0 দেখাচ্ছে যেখানে আমি প্রত্যাশা করেছিলেন 28 কারণ এটি রান-টাইমে অ্যালরাডি সংশোধিত হয়েছিল। এমএসভিসি এর সাথে একমত নয়, তবে ঝাঁকুনি আমার কাছে প্রত্যাশা করা জিনিসটি করে।

প্রশ্নটি হল: আমার পরিস্থিতিতে রান-টাইমে ইনলাইন ভেরিয়েবলগুলি সংশোধন করা যেতে পারে? (আমি ভেরিয়েবলটি ডি-ইনলাইন করে সমস্যার সমাধান করেছি))

উত্তর:


10

হ্যাঁ, inlineভেরিয়েবলগুলি আরম্ভের পরে পরিবর্তন করা যেতে পারে।

তবে, ডিএসএলগুলি উইন্ডোজটিতে এমএসভিসির সাথে অদ্ভুত জিনিস। খুব কাছাকাছি সময়ে, প্রতিটি ডিএলএল সম্পূর্ণ স্বতন্ত্র রানটাইম সহ নিজস্ব সি ++ প্রোগ্রাম হিসাবে মডেল করা হয়। অতএব, inlineমূল প্রোগ্রামের জন্য আপনার ভেরিয়েবলের একটি অনুলিপি এবং অন্যটি ডিএলএল এর জন্য রয়েছে।


1
অনুরূপ ক্যাভিয়েট এমপোটর : একই স্ট্যাটিক লিবকে দুটি ডিএলএল-এর সাথে সংযুক্ত করে (যা আপনি একই প্রোগ্রামের সাথে যুক্ত করেন) সমস্ত স্ট্যাটিক লাইব ভেরিয়েবলের দুটি অনুলিপি তৈরি করবে।
ম্যাক্স ল্যাংফোফ

এর অর্থ হ'ল আমার ধারণা, আমার অবশ্যই অন-ইনলাইন ভেরিয়েবলগুলি ব্যবহার করা উচিত। এটা কি সঠিক? কমপক্ষে একাধিক ঘরের ক্ষেত্রে যেখানে আমি রানটাইমের সময় পরিবর্তিত একটি মান ভাগ করতে চাই ...
জার্মান ডায়াগো

1
হ্যাঁ, আপনাকে নন- inlineভেরিয়েবলগুলি ব্যবহার করতে হবে । সেগুলি একটি ডিএলএল থেকে রফতানি করা হয়েছিল এবং সেখান থেকে অন্যান্য সমস্ত জায়গায় আমদানি করা হয়েছিল তাও আপনার নিশ্চিত করতে হবে।
অ্যান্টনি উইলিয়ামস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.