সি ++ 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.