char* str = "some string"
আপনি যখন ব্যবহার করছেন তখন এই সমস্যাটির কারণ (যা ইস্যুটির তুলনায় সনাক্ত করা আরও শক্ত - যা অন্যরা ব্যাখ্যা করেছে) constexpr
।
constexpr char* str = "some string";
দেখে মনে হচ্ছে এটি এর অনুরূপ আচরণ করবে const char* str
এবং তাই আগে char*
যেমন ঘটেছিল তেমন সতর্কবার্তা সৃষ্টি করবে না , তবে পরিবর্তে এটি আচরণ করবে char* const str
।
বিস্তারিত
ধ্রুবক পয়েন্টার এবং একটি ধ্রুবকের পয়েন্টার। মধ্যে পার্থক্য const char* str
এবং নীচে char* const str
ব্যাখ্যা করা যেতে পারে।
const char* str
: স্ট্রকে কনস্টের চরের পয়েন্টার হিসাবে ঘোষণা করুন। এর অর্থ হ'ল এই পয়েন্টারটি যে ডেটাটিতে এটি নির্দেশ করছে এটি ধ্রুবক। পয়েন্টারটি সংশোধন করা যেতে পারে, তবে ডেটা সংশোধন করার যে কোনও প্রচেষ্টা একটি সংকলন ত্রুটি ছুঁড়ে ফেলবে।
str++ ;
: খালি । আমরা পয়েন্টারটি সংশোধন করছি, এবং ডেটা দেখানো হচ্ছে না।
*str = 'a';
: উদ্বিগ্ন । আমরা নির্দেশিত তথ্য সংশোধন করার চেষ্টা করছি।
char* const str
: চরকে কনস্ট পয়েন্টার হিসাবে ঘোষণা করুন। এর অর্থ এই পয়েন্টটি এখন ধ্রুবক, তবে ডেটাটিও নির্দেশ করা খুব বেশি নয়। পয়েন্টারটি সংশোধন করা যায় না তবে আমরা পয়েন্টারটি ব্যবহার করে ডেটা পরিবর্তন করতে পারি।
str++ ;
: উদ্বিগ্ন । আমরা পয়েন্টার ভেরিয়েবলটি পরিবর্তন করার চেষ্টা করছি যা একটি ধ্রুবক।
*str = 'a';
: খালি । আমরা নির্দেশিত তথ্য সংশোধন করার চেষ্টা করছি। আমাদের ক্ষেত্রে এটি কোনও সংকলনের ত্রুটি সৃষ্টি করবে না, তবে একটি রানটাইম ত্রুটি ঘটায়, কারণ সম্ভবত স্ট্রিংটি সংকলিত বাইনারিটির কেবল পঠনযোগ্য বিভাগে চলে যাবে। এই বিবৃতিটি যদি আমাদের গতিশীলভাবে মেমরির বরাদ্দ করে থাকে তা অর্থপূর্ণ হবে eg char* const str = new char[5];
।
const char* const str
: স্ট্রকে কনস্টের চরকে কনস্টেন্ট পয়েন্টার হিসাবে ঘোষণা করুন। এক্ষেত্রে আমরা না পয়েন্টারটি সংশোধন করতে পারি, না তথ্যকেও নির্দেশ করতে পারি।
str++ ;
: উদ্বিগ্ন । আমরা পয়েন্টার ভেরিয়েবলটি পরিবর্তন করার চেষ্টা করছি যা একটি ধ্রুবক।
*str = 'a';
: উদ্বিগ্ন । আমরা এই পয়েন্টার দ্বারা নির্দেশিত ডেটা পরিবর্তন করার চেষ্টা করছি, যা স্থিরও।
আমার ক্ষেত্রে বিষয়টি হ'ল আমি প্রত্যাশা করছিলাম যে এরূপ constexpr char* str
আচরণ করা উচিত const char* str
, এবং নাchar* const str
, কারণ দৃশ্যত এটি পূর্বের কাছাকাছি বলে মনে হয়।
এছাড়াও, এর জন্য উত্পন্ন সতর্কতাটি constexpr char* str = "some string"
কিছুটা আলাদা char* str = "some string"
।
- সংকলক সতর্কতা
constexpr char* str = "some string"
:ISO C++11 does not allow conversion from string literal to 'char *const'
- জন্য কম্পাইলার সতর্কবার্তা
char* str = "some string"
: ISO C++11 does not allow conversion from string literal to 'char *'
।
ডগা
আপনি সহজেই বোধগম্য ইংলিশ স্টেটমেন্টগুলিতে বিবৃতিতে রূপান্তর করতে সি গিব্বারিশ ↔ ইংলিশ রূপান্তরকারীC
এবং এর বিপরীতে ব্যবহার করতে পারেন । এটি C
একমাত্র হাতিয়ার এবং এর ফলে একচেটিয়া জিনিসগুলি (কনস্টেক্সপ্রের মতো) সমর্থন করবে না C++
।
strncpy(str, func, 255)
পরিবর্তে আপনার ব্যবহার করা উচিতstrcpy(str, func)
। এবং তারপরে স্ট্রিংয়ের শেষে '\ 0' যুক্ত করতে ভুলবেন না কারণ স্ট্রান্সকিপি এটি যুক্ত করে না।