চূড়ান্ত উপসংহার: A এর গাণিতিকগুলি সি এবং সি ++ উভয় void*
ক্ষেত্রেই অবৈধ ।
জিসিসি এটিকে এক্সটেনশান হিসাবে অনুমতি দেয়, গাণিতিকটি void
- এবং ফাংশন-পয়েন্টারগুলি দেখুন (নোট করুন যে এই বিভাগটি ম্যানুয়ালটির "সি এক্সটেনশান" অধ্যায়ের অংশ)। ঝনঝন এবং আইসিসি সম্ভবত void*
জিসিসির সাথে সামঞ্জস্যের উদ্দেশ্যে পাটিগণিতের অনুমতি দেয় । অন্যান্য সংকলক (যেমন এমএসভিসি) গাণিতিকটিকে নিষ্ক্রিয় করে void*
, এবং -pedantic-errors
পতাকাটি নির্দিষ্ট করা থাকলে, বা -Werror-pointer-arith
পতাকাটি নির্দিষ্ট করা থাকলে (এই কোডটি কার্যকর যদি আপনার কোড বেসটি এমএসভিসির সাথেও সংকলন করতে হবে) এই জিসিসি তা অস্বীকার করে ।
সি স্ট্যান্ডার্ড কথা বলে
এন 1256 খসড়া থেকে উদ্ধৃতি নেওয়া হয়েছে।
সংযোজন অপারেশনটির স্ট্যান্ডার্ডের বিবরণে বলা হয়েছে:
..৫.-2-২: অতিরিক্ত হিসাবে, উভয় অপারেন্ডের গাণিতিক টাইপ থাকবে, বা একটি অপারেন্ড কোনও অবজেক্ট টাইপের পয়েন্টার এবং অন্যটির পূর্ণসংখ্যার ধরণ থাকবে।
সুতরাং, এখানে প্রশ্নটি void*
একটি "অবজেক্ট টাইপ" এর পয়েন্টার কিনা , বা সমতুল্য, void
"অবজেক্ট টাইপ" কিনা । "অবজেক্ট টাইপ" এর সংজ্ঞাটি হ'ল:
.2.২.৫.১: প্রকারগুলি অবজেক্টের ধরণগুলিতে বিভক্ত হয় ( ধরণগুলি সম্পূর্ণরূপে বর্ণনা করে এমন প্রকারগুলি), ফাংশন ধরণের ( ফাংশনগুলিতে বর্ণিত প্রকারগুলি) এবং অসম্পূর্ণ প্রকারগুলি (যে ধরণের বিষয়গুলি বর্ণনা করে তবে আকারগুলি নির্ধারণের জন্য প্রয়োজনীয় তথ্যের অভাব রয়েছে)।
এবং মানটি এইভাবে সংজ্ঞায়িত void
করে:
.2.২.৫-১৯: টাইপটিতে void
মানগুলির একটি খালি সেট থাকে; এটি একটি অসম্পূর্ণ প্রকার যা সম্পূর্ণ করা যায় না।
যেহেতু void
একটি অসম্পূর্ণ প্রকার, তাই এটি কোনও বস্তুর প্রকার নয়। সুতরাং এটি কোনও অতিরিক্ত ক্রিয়াকলাপের জন্য বৈধ অপারেন্ড নয়।
অতএব আপনি একটি void
পয়েন্টারের উপর পয়েন্টার গাণিতিক সম্পাদন করতে পারবেন না ।
মন্তব্য
মূলত, void*
সি-স্ট্যান্ডার্ডের এই বিভাগগুলির কারণে, এটি গণিতের অনুমতি দেওয়া হয়েছিল বলে মনে করা হয়েছিল:
.2.২.৫-২7: অকার্যকর
হওয়ার জন্য একটি পয়েন্টারের একটি চরিত্রের ধরণের পয়েন্টার হিসাবে একই উপস্থাপনা এবং প্রান্তিককরণের প্রয়োজনীয়তা থাকতে হবে।
যাহোক,
একই প্রতিনিধিত্ব এবং প্রান্তিককরণের
প্রয়োজনীয়তাগুলি হ'ল ফাংশনগুলিতে আর্গুমেন্ট, ফাংশন থেকে মানগুলি ফেরত দেওয়া এবং ইউনিয়নের সদস্য হিসাবে আদান প্রদানের বোঝা।
এর অর্থ এই যে তাই printf("%s", x)
কিনা একই অর্থ x
টাইপ হয়েছে char*
বা void*
, কিন্তু এটা মানে এই নয় যে আপনি একটি উপর গাণিতিক কি করতে পারেন void*
।
সম্পাদকের দ্রষ্টব্য: এই উত্তরটি চূড়ান্ত উপসংহার প্রতিফলিত করতে সম্পাদিত হয়েছে।