"চর এস [স্ট্যাটিক 10]" এর মতো ফাংশনের অ্যারে প্যারামিটারে স্ট্যাটিক কীওয়ার্ডের উদ্দেশ্য কী?


144

কিছু উত্স কোড ব্রাউজ করার সময় আমি এই জাতীয় একটি ফাংশন জুড়ে এসেছি:

void someFunction(char someArray[static 100])
{
    // do something cool here
}

কিছু পরীক্ষা-নিরীক্ষার মাধ্যমে এটি অন্যান্য কোয়ালিফায়াররাও সেখানে উপস্থিত হতে পারে বলে মনে হয়:

void someFunction(char someArray[const])
{
    // do something cool here
}

এটি উপস্থিত হয় যে বাছাইকারীদের কেবল [ ]তখনই ভিতরে অনুমতি দেওয়া হয় যখন কোনও ক্রমের প্যারামিটার হিসাবে অ্যারে ঘোষণা করা হয় declared এগুলি কী করে? এটি কেন ফাংশন পরামিতিগুলির জন্য পৃথক?

উত্তর:


127

প্রথম ঘোষণা কম্পাইলার যে বলে someArrayহয় অন্তত 100 উপাদান দীর্ঘ। এটি অপটিমাইজেশনের জন্য ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, এর অর্থ এটি someArrayকখনই নয় NULL

নোট করুন যে ফাংশনটিতে কল যখন এই প্রয়োজনীয়তাগুলি পূরণ করে না তখন সি স্ট্যান্ডার্ডকে নির্ণয়ের জন্য সংকলকটির প্রয়োজন হয় না (অর্থাত এটি নিঃশব্দ অপরিবর্তিত আচরণ)।

দ্বিতীয় ঘোষণাপত্রটি কেবল someArray(কোনও someArrayউপাদান নয়!) কনস্ট হিসাবে ঘোষণা করে , আপনি লিখতে পারবেন না someArray=someOtherArray। এটি পরামিতি ছিল যেমন একই char * const someArray

এই বাক্য গঠনটি কেবল []একটি ফাংশন প্যারামিটার তালিকায় একটি অ্যারে ডিক্লেয়ারারের অভ্যন্তরের মধ্যে ব্যবহারযোগ্য us এটি অন্যান্য প্রসঙ্গে উপলব্ধি করতে পারে না।

উপরের দুটি ক্ষেত্রেই স্ট্যান্ডার্ড পাঠ্যটি অন্তর্ভুক্ত রয়েছে, C11 6.7.6.3/7 (সি 99 এ 6.7.5.3/7 ছিল):

যেমন '' টাইপ অ্যারে '' একটি প্যারামিটার ঘোষণাটি করতে '' 'টাইপ করতে যোগ্যতাসম্পন্ন পয়েন্টার', যেখানে টাইপ কোয়ালিফায়ার (যদি থাকে) সেই মধ্যে উল্লিখিত সমন্বয় করিতে হইবে [এবং ]অ্যারের টাইপ শিক্ষাদীক্ষা করুন। যদি মূলশব্দ স্ট্যাটিক এছাড়াও [এবং ]অ্যারের ধরণের ডাইরিভিউশনের মধ্যে উপস্থিত হয়, তবে ফাংশনটির প্রতিটি কলের জন্য, সংশ্লিষ্ট প্রকৃত যুক্তির মান কমপক্ষে যতগুলি উপাদান নির্দিষ্ট করে ঠিক তত পরিমাণে একটি অ্যারের প্রথম উপাদানটিতে অ্যাক্সেস সরবরাহ করবে আকার এক্সপ্রেশন।


35
এই বিষয়টিতে: আমি আশ্চর্য হয়েছি যে এটি NUL পয়েন্টারগুলি গ্রহণ করে না এমন ফাংশনগুলির স্বাক্ষর হিসাবে int foo(struct bar [static 1]);পরিবর্তে এটি ব্যবহার করার পক্ষে বিবেচনা করা উচিত int foo(struct bar *);। (আমি জানি যে এই জাতীয় ফাংশন ফ্ল্যাগ করার জন্য জিসিসির একটি বিকল্প নন স্ট্যান্ডার্ড সিন্ট্যাক্স রয়েছে যাতে সংকলক সতর্কতা দিতে পারে ..)
আর .. গিটিহাব স্টপ হেল্পিং আইসিসি

2
আমি সবেমাত্র জিসিসি এবং বিড়ম্বনাটি পরীক্ষা করে দেখেছি এবং ধরেও নিচ্ছি না যে আমি যখন 0 এর সাথে তুলনা করতে বলি তখন কিছু অ্যার্রে সর্বদা নাল নন, এছাড়াও আমি সি 99 এর সঠিক ধারাটি সংজ্ঞায়িত করার জন্য লড়াই করে যা এটি সংজ্ঞায়িত করে। 6.7.5.3-21 এ একটি নোট রয়েছে যা উদ্দেশ্যযুক্ত অর্থ উল্লেখ করেছে এবং এটিই। আমি সন্দেহ করি যে আমরা এটির উপর নির্ভর করতে পারি। তদ্ব্যতীত, এই সমস্ত ফাংশন স্বাক্ষরের অংশ নয়, তাই এর মাধ্যমে আমরা প্রয়োগ করি এমন অনেক কিছুই নেই।
নর্ডিক মেইনফ্রেমে

5
এই লিঙ্কটি পচা হয়েছে বলে মনে হচ্ছে, এটি কি এটি নির্দেশ করছিল? pic.dhe.ibm.com/infocenter/zos/v1r12/…
রস আইকেন

13
@ নর্ডিক মাইনফ্রেমে: কিছুটা সময় হয়ে গেছে, তবে clangআপনি যখন [static 1]পরামিতি ঘোষণার মাধ্যমে কোনও ফাংশনে জ্ঞাত- ন্যূনু যুক্তিটি প্রেরণের চেষ্টা করবেন তখন এখনকার বর্তমান সংস্করণটি সঠিকভাবে সতর্ক করে ।
স্বপ্নালঙ্কা

1
@CiroSantilli 巴拿馬 文件 六四 事件if (!someArray) { somecode... }be সরানো যেতে পারে
এমএম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.