কেন একটি অব্যবহৃত ফাংশন প্যারামিটার মান বাতিল?


98

কিছু সি প্রকল্পে আমি এই কোডটি দেখেছি:

static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
    (void)ud;
    (void)osize;
    /* some code not using `ud` or `osize` */
    return ptr;
}

দুটি ক্যাসেট শূন্য করার কোনও উদ্দেশ্য কি পরিপূর্ণ হয়?


চার্লসের সংযুক্ত প্রশ্নের মধ্যে সঠিক উত্তর (অব্যক্ত প্যারামিটারগুলি সম্পর্কে সংকলক সতর্কতা প্রতিরোধ করা) বন্ধ করার জন্য ভোট দেওয়া।
টেড

@ কোডি গ্রে - এটি সেই কারণে বন্ধ ছিল। তবে বাস্তবে এটি প্রশ্নের দ্বারাই ছিল না। 689677 প্যারামিটারগুলি নয়, বাতিল করার জন্য রিটার্ন কাস্টিংয়ের কথা বলছিল।
টেড

19
আসলে উভয় সদৃশই এই প্রশ্নের পক্ষে বৈধ নয়। একটি হ'ল সি ++, অন্যটি রিটার্নের মান সম্পর্কিত। এগুলি একই জিনিস নয় । কোনও সি প্যারামিটার নকল আছে?
ম্যাট জয়েনার

4
প্রস্তাবিত সদৃশগুলি কীভাবে আচ্ছাদন করা হয়েছে তার চেয়ে এটি আলাদা প্রশ্ন। ভুলটি কেন করা হয়েছিল তা আমি দেখতে পাচ্ছি। পুনরায় খোলা (স্পষ্টতই)।
টিম পোস্ট

4
বিজ্ঞপ্তি: দয়া করে এটিকে C ++ প্রশ্নের নকল হিসাবে বন্ধ করবেন না কারণ সি ++ (void)কিছুটা ভিন্ন প্রভাবের জন্য ব্যবহার করে। এই প্রশ্নটি সি
অ্যান্টি হাপাল

উত্তর:


89

সংকলক থেকে সতর্কতাগুলি এড়াতে এখানে রয়েছে কারণ কিছু পরামিতি অব্যবহৃত।


4
কি সবচেয়ে ভালো উপায় সতর্কবার্তা দমন করা: stackoverflow.com/questions/3417837/...
সিরো Santilli郝海东冠状病六四事件法轮功

@ বেনোইট কাস্টিং অকার্যকর আসলে কি করে? সংকলকটি দেখানোর জন্য এটির একমাত্র কাজ যা আপনি ইচ্ছাকৃতভাবে কিছু উপেক্ষা করছেন বা (শূন্য) আসলে কিছু করছেন এবং সংকলক যখন এটি দেখবে, তখন এটি কেবল এটি ভেরিয়েবলের সাথে কিছু করেছে বলে গণ্য করবে এবং সুতরাং সতর্কতা জারি করবে না?
টান ওয়াং

4
@ টানওয়াং এর একমাত্র কাজটি হ'ল সংকলকটি দেখানো যে আপনি ইচ্ছাকৃতভাবে কোনও কিছু উপেক্ষা করছেন। রানটাইমে এটি কিছুই করবে না।
zwol

14

কারণ অব্যবহৃত থাকার প্রোটোটাইপ মধ্যে পরামিতি সাধারণত ফাংশন কিছু বহিরাগত এপিআই চাহিদার সাথে সামঞ্জস্য থেকে কারণ হয় - সম্ভবত এটি একটি লাইব্রেরি ফাংশন, বা যে ফাংশন একটি পয়েন্টার অন্য ফাংশন যে এই আহ্বান সম্মেলন আশা প্রেরণ করা হয়। তবে কলিং কনভেনশন দ্বারা ব্যবহৃত সমস্ত যুক্তিগুলি আসলে ফাংশনেই প্রয়োজন হয় না।

শরীরে পরামিতিটির নাম উল্লেখ করার কারণটি হ'ল সতর্কতা এড়ানো

unused.c: In function ‘l_alloc’:
unused.c:3:22: warning: unused parameter ‘ud’ [-Wunused-parameter]
 void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
                      ^~

এই সতর্কতাটি ফাংশন বডিটিতে প্রকৃত প্যারামিটার ব্যবহার করে দমন করা যেতে পারে। উদাহরণস্বরূপ আপনার যদি নিম্নলিখিত বিবৃতিটি থাকে:

ud;

এই সতর্কতা এখন দমন করা হয়। তবে এখন জিসিসি আরেকটি সতর্কতা উত্পন্ন করবে :

unused.c:5:5: warning: statement with no effect [-Wunused-value]
     ud;
     ^~

এই সতর্কতাটি জানিয়েছে যে বিবৃতিটি ud;সিন্টেক্সিকভাবে বৈধ সি হওয়ার সময় কিছুতেই কোনও প্রভাব ফেলবে না এবং সম্ভবত একটি ভুল, বিবৃতিটির বিপরীতে নয়

abort;

যা সম্ভবত abort();এটি কিছু করার পরিবর্তে হিসাবে লেখা উচিত ছিল ।

এবং সেখানেই (void)castালাই আসবে - এটি সংকলকটিকে নির্বিঘ্নে এবং স্পষ্টভাবে বলবে যে বিবৃতিটির একেবারে কোনও প্রভাব নেই বলে মনে করা হচ্ছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.