আমরা যখন কোনও ফাংশনের আকার ব্যবহার করে যাচাই করি sizeof()
, আমরা সর্বদা 1 বাইট পাই । এই 1 বাইটটি কী বোঝায়?
আমরা যখন কোনও ফাংশনের আকার ব্যবহার করে যাচাই করি sizeof()
, আমরা সর্বদা 1 বাইট পাই । এই 1 বাইটটি কী বোঝায়?
উত্তর:
এটি একটি সীমাবদ্ধতা লঙ্ঘন এবং আপনার সংকলকটি এটি নির্ধারণ করা উচিত । যদি তা সত্ত্বেও এটি সংকলন করে, আপনার প্রোগ্রামটির ব্যর্থতা মোডের স্পষ্টকরণের জন্য @ স্টিভ জেসপকে ধন্যবাদ জানাতে হবে এবং কিছু সংকলক এটি কেন অনুমতি দেয় তার জন্য @ মিশেল বারার উত্তর দেখুন ]: সি 11, 6.5.3.4./ থেকে 1:
sizeof
অপারেটর একটি অভিব্যক্তি ফাংশন টাইপ আছে প্রয়োগ করা হইবে
-std=c11
, না gnu11
। এটি একটি সত্যই অদ্ভুত সংকলক এক্সটেনশন।
sizeof(void)
জিএনইউ সি-তে 1
-std=c11
: কারওরূপে -std=c*
বিজ্ঞাপনের মানগুলিতে বিকল্পগুলি উল্লেখ করা উচিত । তারা কনফরমেশন মোড সক্ষম করে না, তারা কেবলমাত্র এমন এক্সটেনশনগুলি অক্ষম করে যা একটি সুগঠিত প্রোগ্রামকে সংকলন থেকে বিরত রাখে (যেমন typeof
একটি কীওয়ার্ড হওয়া, যেহেতু একটি সুগঠিত সি প্রোগ্রাম এটিকে চলক নাম হিসাবে ব্যবহার করতে পারে তবে gcc
ডিফল্টরূপে এটি প্রত্যাখ্যান করবে) )। অতিরিক্ত নিষ্ক্রিয় এক্সটেনশনের অসুস্থ গঠিত প্রোগ্রাম undiagnosed পাস অনুমতি দিতে, আপনি প্রয়োজন -pedantic
বা -pedantic-errors
।
এটি অপরিবর্তিত আচরণ নয় - অপারেটরের sizeof
জন্য সীমাবদ্ধতা লঙ্ঘন করার কারণে ফাংশন ডিজাইনার (একটি ফাংশন নাম) দিয়ে অপারেটরটি ব্যবহার করার সময় সি ভাষার মানটির ডায়াগনস্টিক প্রয়োজন sizeof
।
যাইহোক, সি ল্যাঙ্গুয়েজ একটি এক্সটেনশান হিসাবে, জিসিসি উপর গাণিতিক পারবেন void
পয়েন্টার এবং ফাংশন পয়েন্টার, যা একটি আকার চিকিত্সা দ্বারা সম্পন্ন করা হয় void
বা একটি ফাংশন 1
। ফলস্বরূপ, sizeof
অপারেটর জিসিসি সহ কোনও ফাংশনের 1
জন্য মূল্যায়ন করবে void
। Http://gcc.gnu.org/onlinesocs/gcc/Pointer-Arith.html# পয়েন্টার- অরিথ দেখুন
আপনি জিসিসির কাছে বিকল্পগুলি বা বিকল্পগুলি sizeof
ব্যবহার করে এই অপারেশনগুলির সাথে ব্যবহার করার সময় আপনি একটি সতর্কতা জারি করতে জিসিসি পেতে পারেন । অথবা এটি দিয়ে একটি ত্রুটি করুন ।-pedantic
-Wpointer-arith
-Werror=pointer-arith
sizeof
কোনও ফাংশনটি ইউবি নয় (যা আমি বেশ উল্লেখ করেছি কেবলমাত্র অন্যান্য উত্তর বলেছিল এটি ইউবি ছিল)। তবে আমি বাক্যটি কাঠামোগত করার কারণেই সম্ভবত এটি বিড়বিড় করেছিলাম। আরও পরিষ্কার হতে হবে। sizeof
কোনও ফাংশনটি ইউবি নয় (যেমন বেশ কয়েকটি উত্তর দাবি করেছে)। এটি একটি সীমাবদ্ধ লঙ্ঘন is যেমন, এটি একটি ডায়াগনস্টিক প্রয়োজন। জিসিসি এটিকে এক্সটেনশন হিসাবে অনুমতি দেয়।
এটি ইঙ্গিত দেয় যে সংকলক লেখক আপনার নাক থেকে অসুরদের উড়ে না যাওয়ার পরিবর্তে 1 টির মান নিয়ে সিদ্ধান্ত নিয়েছেন (সত্যই, এটির আর একটি অপরিবর্তিত ব্যবহারই sizeof
আমাদের এই অভিব্যক্তিটি দিয়েছিল: "সি সংকলক নিজেই একটি ডায়াগনস্টিক ইস্যু করতে হবে যদি এটি প্রথম প্রয়োজন তবে আপনার প্রোগ্রামের ফলে ডায়াগনস্টিক এবং তারপরে মায়েরা নিজেই আপনার নাক থেকে রাক্ষসকে উড়ে নিয়ে যায় (যা সিনট্যাক্সের বিধি বা বাধাগুলির আরও লঙ্ঘনের জন্য আরও ডায়াগনস্টিকস দিতে পারে) এই বিষয়ে, যে কোনও কারণে এটি চয়ন করে) "" https://groups.google.com/forum/?fromgroups=#!msg/comp.std.c/ycpVKxTZkgw/S2hHdTbv4d8J
এটি থেকে এখানে অনির্ধারিত নির্মাণের প্রতিক্রিয়া হিসাবে কোনও সংকলক যা সিদ্ধান্ত নেয় তার জন্য "অনুনাসিক অসুর" শব্দটি রয়েছে। 1
এই ক্ষেত্রে এই সংকলকের অনুনাসিক দৈত্য।
অন্যরা যেমন উল্লেখ করেছে, মাপের () কোনও বৈধ শনাক্তকারী নিতে পারে তবে এটি ফাংশন নামের জন্য কোনও বৈধ (সত্যই সত্য এবং কার্যকর) ফলাফল দেয় না। তদ্ব্যতীত, এটি অবশ্যই "নাক থেকে শয়তান" সিনড্রোমের ফলাফল হতে পারে বা নাও পারে।
আপনি যদি নিজের প্রোগ্রামের ফাংশন আকারটি প্রোফাইল করতে চান তবে লিঙ্কার ম্যাপটি পরীক্ষা করুন, যা মধ্যবর্তী ফলাফল ডিরেক্টরিতে পাওয়া যেতে পারে (এটি যেখানে জিনিসগুলি .obj / .o তে সংকলিত হয় বা যেখানে ফলস্বরূপ চিত্র / নির্বাহযোগ্য স্তর থাকে)। কখনও কখনও এই মানচিত্র ফাইলটি উত্পন্ন বা না করার বিকল্প রয়েছে ... এটি সংকলক / লিঙ্কার নির্ভর।
যদি আপনি কোনও ফাংশনের পয়েন্টারের আকার চান তবে সেগুলি সমস্ত একই আকার, আপনার সিপুতে একটি ঠিকানা শব্দের আকার।
int x = 1;
তবে এর মধ্যে কেবলমাত্র একটি মান সম্মতিযুক্ত সংকলক জন্য অনুমোদিত। sizeof()
কোনও ফাংশনে প্রয়োগ হওয়ার সাথে সাথে এটি কোনও নির্দিষ্ট মূল্য ফেরত দিতে পারে না, বা সংকলন করতে অস্বীকার করতে পারে, বা কোনও নির্দিষ্ট নিবন্ধের সময়ে যে কোনও রেকর্ডারে যা আছে তার ভিত্তিতে একটি এলোমেলো মান ফিরে আসতে পারে। আক্ষরিক অনুনাসিক অসুরগুলি অসম্ভব, তবে মানের অক্ষরের মধ্যে।
sizeof
একটি পয়েন্টারের প্রয়োগ করুন ।
-pedantic
), আপনার একটি অ-সঙ্গতিপূর্ণ সংকলক রয়েছে এবং প্রতিটি প্রোগ্রামেরই অপরিবর্তিত আচরণ রয়েছে।