কোনও পরামিতি (প্রকৃত ফাংশন সংজ্ঞা তুলনায়) সমেত একটি ফাংশন কেন সংকলন করে?


388

আমি সবেমাত্র কারও সি ​​কোড পেয়েছি যা কেন এটি সংকলন করছে তা নিয়ে আমি বিভ্রান্ত। দুটি বিষয় আছে যা আমি বুঝতে পারি না।

প্রথমত, ফাংশন প্রোটোটাইপের আসল ফাংশন সংজ্ঞাটির সাথে তুলনা করে কোনও প্যারামিটার নেই। দ্বিতীয়ত, ফাংশন সংজ্ঞায়নের প্যারামিটারের কোনও প্রকার নেই।

#include <stdio.h>

int func();

int func(param)
{
    return param;
}

int main()
{
    int bla = func(10);    
    printf("%d", bla);
}

কেন এই কাজ করে? আমি এটি কয়েক সংকলকের পরীক্ষিত করেছি এবং এটি ভাল কাজ করে।


77
এটি কেএন্ডআর সি। ১৯৮০ এর দশকে পূর্ণ ফাংশন প্রোটোটাইপ হওয়ার আগে আমরা এই জাতীয় কোড লিখেছিলাম।
হিউডব্রাউন

6
জিসিসি -Wstrict-prototypesএই int func()এবং int main(): xc: 3: সতর্কতা: ফাংশন ঘোষণা কোনও প্রোটোটাইপ নয় উভয়ের জন্য সতর্ক করে । আপনার পাশাপাশি ঘোষণা main()করা উচিত main(void)
জেনস

3
@ জেনস কেন আপনি প্রশ্নটি সম্পাদনা করেছেন? আপনি এই পয়েন্টটি মিস করেছেন বলে মনে হচ্ছে ...
dlras2

1
আমি কেবল অন্তর্নিহিত ইন্ট স্পষ্ট করে তুলেছি। কিভাবে পয়েন্ট মিস করবেন না? আমার বিশ্বাস বিন্দুটি কেন int func();এটির সাথে সামঞ্জস্যপূর্ণ int func(arglist) { ... }
জেনস

3
পছন্দ করুন C99 5.1.2.2.1 আপনার দাবির সুস্পষ্টভাবে বিরোধিতা করে এবং বলে যে কোনও আর্গুমেন্ট সংস্করণ নয় int main(void)
জেনস

উত্তর:


271

অন্যান্য সমস্ত উত্তর সঠিক, তবে কেবল সম্পূর্ণ করার জন্য

একটি ফাংশন নিম্নলিখিত পদ্ধতিতে ঘোষণা করা হয়:

  return-type function-name(parameter-list,...) { body... }

রিটার্ন টাইপ পরিবর্তনশীল যে ধরনের ফাংশন আয় হয়। এটি কোনও অ্যারে টাইপ বা কোনও ফাংশন প্রকার হতে পারে না। যদি দেওয়া না হয়, তবে int অনুমান করা হয়

ফাংশন-নাম ফাংশনের নাম

পরামিতি-তালিকা ফাংশন কমা দ্বারা পৃথক করা হয় যে পরামিতিগুলির তালিকা। যদি কোনও প্যারামিটার দেওয়া না হয়, তবে ফাংশনটি কোনও গ্রহণ করে না এবং খালি সেট বন্ধনী বা সংজ্ঞাটি শূন্যতার সাথে সংজ্ঞায়িত করা উচিত। যদি কোনও ভেরিয়েবল টাইপ প্যারামিটার তালিকার কোনও ভেরিয়েবলের সামনে না থাকে তবে int অনুমান করা হয় । অ্যারে এবং ফাংশনগুলি ফাংশনে স্থানান্তরিত হয় না তবে স্বয়ংক্রিয়ভাবে পয়েন্টারে রূপান্তরিত হয়। যদি একটি উপবৃত্ত (, ...) দিয়ে তালিকাটি সমাপ্ত হয় তবে প্যারামিটারের কোনও সেট নম্বর নেই। দ্রষ্টব্য: একটি উপবৃত্ত ব্যবহার করার সময় শিরোনাম stdarg.h টি আর্গুমেন্ট অ্যাক্সেস করতে ব্যবহার করা যেতে পারে।

এবং আবার সম্পূর্ণতার খাতিরে। সি 11 স্পেসিফিকেশন থেকে 6: 11: 6 (পৃষ্ঠা: 179)

খালি বন্ধনী সহ ফাংশন declarators ব্যবহার (না প্রোটোটাইপ-বিন্যাসে প্যারামিটার প্রকার declarators) একটি লুপ্তপ্রায় বৈশিষ্ট্য


2
"প্যারামিটার তালিকার কোনও ভেরিয়েবলের ধরণ যদি ভেরিয়েবলের সামনে না থাকে তবে int অনুমান করা হয়।" আমি এটি আপনার সরবরাহিত লিঙ্কটিতে দেখতে পাচ্ছি, তবে আমি এটি কোনও মান c89, c99 এ খুঁজে পাচ্ছি না ... আপনি কি অন্য উত্স সরবরাহ করতে পারেন?
Godaygo

"যদি কোনও প্যারামিটার দেওয়া না হয়, তবে ফাংশনটি কোনও গ্রহণ করে না এবং খালি সেট বন্ধনী দিয়ে সংজ্ঞায়িত করা উচিত" টনি দ্য লায়ন এর উত্তরের বিপরীত মনে হলেও আমি কেবল শিখেছি যে টনি দ্য লায়নটির উত্তরটি সঠিকভাবে সঠিক।
জাকুন

160

সি এর func()অর্থ হল যে আপনি যে কোনও সংখ্যক আর্গুমেন্ট পাস করতে পারেন। আপনি যদি কোনও যুক্তি না চান তবে আপনাকে এটি হিসাবে ঘোষণা করতে হবে func(void)। ডিফল্ট নির্দিষ্ট না করা থাকলে আপনি যে ধরণের ফাংশনে আপনার ফাংশনে যাচ্ছেন তা int


3
প্রকৃতপক্ষে কোন একক টাইপ ডিফল্ট নেই। আসলে, সমস্ত আরগগুলি পূর্বনির্ধারিত (এমনকি রিটার্নের ধরণ) -এ ডিফল্ট হয়। কল করা পুরোপুরি ঠিক আছে func(42,0x42);(যেখানে সমস্ত কল দুটি আর্গ ফর্ম ব্যবহার করা উচিত)।
জেনস

1
সি এটা অনির্দিষ্ট প্রকারের ডিফল্ট জন্য বেশ সাধারণ int- এ উদাহরণস্বরূপ যখন আপনি একটি ভেরিয়েবল ডিক্লেয়ার: স্বাক্ষরবিহীন X; ভেরিয়েবল এক্স কি ধরণের? এটি এর স্বাক্ষরবিহীন ইনট
বিটেক

4
আমি বরং বলতে চাই যে পুরাতন দিনগুলিতে অন্তর্নিহিত বিষয়গুলি সাধারণ ছিল । এটি অবশ্যই আর নেই এবং C99 এ এটি সি থেকে সরানো হয়েছে
জেনস

2
এটি লক্ষণীয় উপযুক্ত হতে পারে যে এই উত্তরটি খালি প্যারামিটার তালিকার সাথে ফাংশন প্রোটোটাইপগুলিতে প্রযোজ্য, তবে খালি প্যারামিটার তালিকার সাথে ফাংশন সংজ্ঞা নয়
অটিস্টিক

@ মেমোনিকফ্লো যে কোনও "অনির্দিষ্ট টাইপ ডিফল্ট অব ইনট" নয়; unsignedএকই ধরণের জন্য অন্য একটি নাম unsigned int
hobbs

58

int func();কোনও সি স্ট্যান্ডার্ড ছিল না এমন দিনগুলি, যেমন কেএন্ডআর সি এর দিনগুলি (১৯৮৯ সালের আগে, প্রথম "এএনএসআই সি" মান প্রকাশিত হয়েছিল) সেই দিন থেকেই একটি অপ্রচলিত কর্মসূচি ঘোষণা ।

মনে রাখবেন কেএন্ডআর সি তে কোনও প্রোটোটাইপvoid ছিল না এবং কীওয়ার্ডটি এখনও আবিষ্কার হয়নি। আপনি যা করতে পেরেছিলেন তা হ'ল সংকলককে কোনও ফাংশনের রিটার্নের ধরন সম্পর্কে জানানো । কে অ্যান্ড আর সি-এর খালি প্যারামিটার তালিকার অর্থ "একটি অনির্দিষ্ট কিন্তু স্থির" আর্গুমেন্টের সংখ্যা। স্থির অর্থ হ'ল আপনাকে অবশ্যই প্রতিটি বার একই সংখ্যক আরগ দিয়ে ফাংশনটি কল করতে হবে (যেমন একটি বৈকল্পিক ফাংশনের বিপরীতে printf, যেখানে প্রতিটি কলের জন্য নম্বর এবং প্রকার পৃথক হতে পারে)।

অনেক সংকলক এই নির্মাণ নির্ণয় করবে; বিশেষত gcc -Wstrict-prototypesআপনাকে বলবে "ফাংশন ডিক্লেয়ারেশন কোনও প্রোটোটাইপ নয়", যা স্পটযুক্ত, কারণ এটি প্রোটোটাইপের মতো দেখায় (বিশেষত যদি আপনি সি ++ দ্বারা বিষাক্ত হন) তবে তা নয়। এটি একটি পুরানো স্টাইলের কে ও আর সি রিটার্নের ধরণের ঘোষণা।

থাম্বের বিধি: কোনও খালি প্যারামিটার তালিকা ঘোষণাটি খালি রাখবেন না, int func(void)নির্দিষ্ট হতে ব্যবহার করুন । এটি কে ওআরআর রিটার্ন ধরণের ঘোষণাকে যথাযথ সি 89 প্রোটোটাইপে পরিণত করে। সংকলকগণ খুশি, বিকাশকারীরা খুশি, স্থির চেকাররা খুশি। সি ++ এর ডাব্লু ^ ডাব্লুফন্ড দ্বারা বিভ্রান্তকারীরা ক্রিংস হতে পারে, যদিও তাদের বিদেশী ভাষার দক্ষতা প্রয়োগ করার চেষ্টা করার সময় তাদের অতিরিক্ত অক্ষরগুলি টাইপ করতে হবে :-)


1
এটি সি ++ এর সাথে সম্পর্কিত করবেন না। এটা সাধারণ জ্ঞান যে খালি যুক্তি তালিকার অর্থ কোনও প্যারামিটার নেই এবং প্রায় 40 বছর আগে কেএন্ডআর ছেলেরা যে ভুল করেছে তার মোকাবেলা করতে বিশ্বের মানুষ আগ্রহী নয়। তবে কমিটি পন্ডিতরা বিপরীতমুখী পছন্দগুলি টেনে আনতে থাকেন - সি 99, সি 11 এ।
pfalcon

1
@ পিফালকন সাধারণ জ্ঞানটি যথেষ্ট বিষয়ভিত্তিক। একজনের কাছে সাধারণ জ্ঞান হ'ল অন্যের কাছে সরল উন্মাদনা। পেশাদার সি প্রোগ্রামাররা জানেন যে খালি প্যারামিটার তালিকাগুলি একটি অনির্ধারিত তবে নির্দিষ্ট সংখ্যক যুক্তি নির্দেশ করে। এটি পরিবর্তন করা সম্ভবত অনেকগুলি বাস্তবায়ন ভঙ্গ করবে। আইএমএইচও, নীরব পরিবর্তনগুলি এড়ানোর জন্য কমিটিগুলিকে দোষারোপ করা ভুল গাছটিকে ফাঁকি দিচ্ছে।
জেনস

53
  • খালি প্যারামিটার তালিকার অর্থ "কোনও যুক্তি", সুতরাং সংজ্ঞাটি ভুল নয়।
  • অনুপস্থিত টাইপটি ধরে নেওয়া হয় int

আমি কনফিগার করা সতর্কতা / ত্রুটি স্তরের অভাব হতে পারে এমন কোনও বিল্ড বিবেচনা করব, যদিও প্রকৃত কোডের জন্য এটি হওয়ার কোনও মানে নেই।


30

এটি কে ও আর স্টাইলের ফাংশন ঘোষণা এবং সংজ্ঞা। সি 99 স্ট্যান্ডার্ড থেকে (আইএসও / আইসিসি 9899: টিসি 3)

বিভাগ 6.7.5.3 ফাংশন ঘোষক (প্রোটোটাইপ সহ)

একটি সনাক্তকারী তালিকা ফাংশনের পরামিতিগুলির সনাক্তকারীদের কেবল ঘোষণা করে। ফাংশন ডিক্লেয়ারের একটি খালি তালিকা যা সেই ফাংশনের সংজ্ঞাটির অংশ এটি নির্দিষ্ট করে যে ফাংশনের কোনও পরামিতি নেই। কোনও ফাংশন ডিক্লেয়ারের খালি তালিকা যা সেই ফাংশনের সংজ্ঞাটির অংশ নয় এটি নির্দিষ্ট করে যে পরামিতিগুলির সংখ্যা বা প্রকার সম্পর্কে কোনও তথ্য সরবরাহ করা হয়নি। (উভয় ফাংশনের ধরণ যদি "পুরাতন স্টাইল" হয় তবে পরামিতিগুলির ধরণের তুলনা করা হয় না))

বিভাগ 6.11.6 ফাংশন ঘোষণাকারী

খালি বন্ধনীর সাথে ফাংশন ডিক্লেটারের ব্যবহার (প্রোটোটাইপ-ফর্ম্যাট প্যারামিটার ধরণের ডিক্লেটারগুলি নয়) একটি অপ্রচলিত বৈশিষ্ট্য।

বিভাগ 6.11.7 ফাংশন সংজ্ঞা

পৃথক প্যারামিটার শনাক্তকারী এবং ঘোষণার তালিকার সাথে ফাংশন সংজ্ঞাগুলির ব্যবহার (প্রোটোটাইপ-ফর্ম্যাট প্যারামিটারের ধরণ এবং শনাক্তকারী ডিক্লেয়ার নয়) একটি অপ্রচলিত বৈশিষ্ট্য।

যা পুরাতন স্টাইল মানে কে ও আর স্টাইল

উদাহরণ:

ঘোষণা: int old_style();

সংজ্ঞা:

int old_style(a, b)
    int a; 
    int b;
{
     /* something to do */
}

16

intফাংশন রিটার্ন টাইপ এবং পরামিতি তালিকায় কোনও প্রকার দেওয়া না হলে সি ধরে নেয় । শুধুমাত্র এই নিয়মের জন্য অদ্ভুত জিনিসগুলি অনুসরণ করা সম্ভব।

একটি ফাংশন সংজ্ঞা এই মত দেখাচ্ছে।

int func(int param) { /* body */}

যদি এটি প্রোটোটাইপ হয় আপনি লিখুন

int func(int param);

প্রোটোটাইপে আপনি কেবলমাত্র পরামিতিগুলির ধরণ নির্দিষ্ট করতে পারেন। পরামিতিগুলির নাম বাধ্যতামূলক নয়। সুতরাং

int func(int);

এছাড়াও আপনি যদি প্যারামিটারের ধরন নির্দিষ্ট না করেন তবে নামটি intধরণ হিসাবে ধরে নেওয়া হয়।

int func(param);

আপনি যদি আরও দূরে যান তবে নিম্নলিখিতগুলিও কাজ করে।

func();

সংকলক int func()যখন আপনি লেখেন তখন ধরে নেওয়া হয় func()। কিন্তু func()একটি ফাংশন বডি ভিতরে রাখবেন না । এটি একটি ফাংশন কল হবে


3
একটি খালি প্যারামিটার তালিকা অন্তর্নিহিত ইন্ট টাইপের সাথে সম্পর্কিত নয়। int func()এর অন্তর্নিহিত রূপ নয় int func(int)
জন বার্থোলোমিউ

11

যেমনটি বলা হয়েছে কৃষ্ণভাবদ্র, অন্যান্য ব্যবহারকারীর সমস্ত পূর্ববর্তী প্রতিক্রিয়াগুলির সঠিক ব্যাখ্যা রয়েছে এবং আমি কেবল কয়েকটি পয়েন্টের আরও বিশদ বিশ্লেষণ করতে চাই।

এএনএসআই-সি-এর মতো ওল্ড-সি-তে, " টাইপযুক্ত ফর্মাল প্যারামিটার ", আপনার কাজের রেজিস্ট্রার বা নির্দেশ গভীরতার সক্ষমতা (ছায়া নিবন্ধক বা নির্দেশ संचयी চক্র) এর একটি দ্বিগুণ করুন, একটি 8 বিট এমপিইউতে, একটি 16 বিট হবে এমপিইউ এবং তাই এটি একটি ইনট 16 হবে, ক্ষেত্রে ক্ষেত্রে 64 বিট আর্কিটেকচারগুলি বিকল্পগুলি: -m32 সংকলন করতে পছন্দ করতে পারে।

যদিও এটি উচ্চ স্তরে সরল বাস্তবায়ন বলে মনে হচ্ছে, একাধিক পরামিতিগুলি পাস করার জন্য, নিয়ন্ত্রণ ডাইমনসিওন ডেটা টাইপ ধাপে প্রোগ্রামারটির কাজটি আরও দাবী হয়ে ওঠে।

অন্যান্য ক্ষেত্রে, কিছু মাইক্রোপ্রসেসরের আর্কিটেকচারের জন্য, এএনএসআই সংকলকগুলি কোডটির ব্যবহারের অনুকূলকরণের জন্য এই পুরানো কিছু বৈশিষ্ট্যগুলি কাস্টমাইজড, কিছু কাজে লাগিয়েছে, কাজের রেজিস্টারের অভ্যন্তরে বা বাইরে কাজ করার জন্য এই "অপ্রচলিত আনুষ্ঠানিক পরামিতিগুলির" অবস্থান জোর করে, আজ আপনি পাবেন "উদ্বায়ী" এবং "রেজিস্টার" ব্যবহারের ক্ষেত্রে প্রায় একই।

তবে এটি লক্ষ করা উচিত যে সর্বাধিক আধুনিক সংকলক, দুই ধরণের পরামিতি ঘোষণার মধ্যে কোনও পার্থক্য তৈরি করে না।

লিনাক্সের অধীনে জিসিসি সহ সংকলনের উদাহরণ:

main.c

main2.c

main3.c  
যে কোনও ক্ষেত্রে স্থানীয়ভাবে প্রোটোটাইপের বিবৃতি কোনও কাজে আসে না, কারণ এই প্রোটোটাইপের উল্লেখের সাথে প্যারামিটার ছাড়াই কোনও কল নেই তবে তা পরিত্যাগযোগ্য হবে। যদি আপনি কোনও বাহ্যিক কলের জন্য "অপরিকল্পিত ফর্মাল প্যারামিটার" সহ সিস্টেমটি ব্যবহার করেন, তবে একটি প্রসারণমূলক প্রোটোটাইপ ডেটা প্রকার উত্পন্ন করতে এগিয়ে যান।

এটার মত:

int myfunc(int param);

5
আমি ইমেজগুলির অপ্টিমাইজ করতে সমস্যাটি নিয়েছি যে চিত্রগুলির বাইটের আকারটি সর্বনিম্ন সম্ভব ছিল। আমি মনে করি যে ছবিগুলি উত্পন্ন কোডটির মধ্যে পার্থক্যের অভাবের একটি দ্রুত দৃষ্টিভঙ্গি পেতে পারে। আমি কোডটি পরীক্ষা করে যাচ্ছি, এটি কী দাবি করেছে তার আসল ডকুমেন্টেশন উত্পন্ন করছে এবং সমস্যাটি সম্পর্কে তাত্পর্যপূর্ণ নয়। তবে সবাই বিশ্বকে একইভাবে দেখে না। আমি ভয়াবহভাবে দুঃখিত যে সম্প্রদায়টি আপনাকে এত বেশি বিরক্ত করার জন্য আরও তথ্য সরবরাহ করার আমার প্রচেষ্টা my
আরটিএসকিট

1
আমি বেশ নিশ্চিত যে একটি অনির্ধারিত রিটার্ন টাইপ সর্বদা হয় int, যা সাধারণত কর্ম-নিবন্ধের আকার বা 16 বিট, যেটি ছোট হয়।
সুপারক্যাট

@ সুপের্যাট +1 নিখুঁত ছাড়, আপনি ঠিক বলেছেন! এটি ঠিক আমি উপরে আলোচনা করেছি, একটি নির্দিষ্ট আর্কিটেকচারের জন্য ডিফল্ট দ্বারা ডিজাইন করা একটি সংকলক, সর্বদা প্রশ্নে সিপিইউ / এমপিইউয়ের কাজের-নিবন্ধের আকারকে প্রতিফলিত করে, তাই এম্বেড এমভায়ারওয়ামেন্টে, একটিতে আবার বিভিন্ন টাইপ করার কৌশল রয়েছে রিয়েলটাইম ওএস, একটি সংকলক স্তর (stdint.h) বা একটি পোর্টেবিলিটি স্তরতে, যা অন্য অনেকের মধ্যে একই পোর্টেবল একই ওএস তৈরি করে এবং সিপিইউ / এমপিইউ নির্দিষ্ট ধরণের (প্রান্ত, দীর্ঘ, দীর্ঘ দীর্ঘ, ইত্যাদি) দ্বারা প্রান্তিককরণ দ্বারা প্রাপ্ত জেনেরিক সিস্টেম ধরণের u8, u16, u32 সহ 32
আরটিএসকিট

@ সুপের্যাট কোনও অপারেটিং সিস্টেম বা নির্দিষ্ট সংকলক দ্বারা প্রদত্ত নিয়ন্ত্রণের প্রকারগুলি ছাড়াই আপনার বিকাশের সময় কিছুটা নজর দেওয়া দরকার এবং আপনি যে সমস্ত "টি টাইপড অ্যাসাইনমেন্টস" আপনার অ্যাপ্লিকেশন ডিজাইনের সাথে সামঞ্জস্য করেছেন তার আগে "সন্ধানের আশ্চর্য হওয়ার জন্য" 16 বিট ইনট "এবং" 32 বিট ইনট "নয়।
আরটিএসকিট

@ আরটিসকিট: আপনার উত্তরটি পরামর্শ দেয় যে একটি 8-বিট প্রসেসরের ডিফল্ট টাইপটি একটি ইন্টার 8 হবে। আমি পিকমিক্রো ব্র্যান্ডের আর্কিটেকচারের জন্য যেখানে দু'টি সি-ইশ সংকলককে স্মরণ করিয়ে দিয়েছি তা মনে করি, তবে আমি মনে করি না যে সি স্ট্যান্ডার্ডের অনুরূপ কিছু দূরবর্তী ক্ষেত্রে এমন কোনও intধরণের অনুমতি দিয়েছে যা পরিসরের সমস্ত মান ধরে রাখতে উভয়ই সক্ষম ছিল না - 32767 থেকে +32767 (নোট -32768 প্রয়োজন নেই) এবং সমস্ত charমান ধরে রাখতে সক্ষম (অর্থাত্ যদি char16 বিট হয় তবে তা স্বাক্ষরিত intহওয়া আবশ্যক বা অবশ্যই এটির চেয়ে বড় হতে হবে)।
সুপারক্যাট

5

প্যারামিটারের প্রকারের বিষয়ে, এখানে ইতিমধ্যে সঠিক উত্তর রয়েছে তবে আপনি যদি এটি সংকলকটি থেকে শুনতে চান তবে আপনি কয়েকটি পতাকা যুক্ত করার চেষ্টা করতে পারেন (পতাকাগুলি প্রায়শই ভাল ধারণা হয়ে থাকে)।

আপনার প্রোগ্রামটি সংকলিত করে gcc foo.c -Wextraআমি পেয়েছি:

foo.c: In function func’:
foo.c:5:5: warning: type of param defaults to int [-Wmissing-parameter-type]

আশ্চর্যের -Wextraসাথে এটি ধরা দেয় না clang(এটি কোনও -Wmissing-parameter-typeকারণে স্বীকৃতি দেয় না , সম্ভবত উপরে বর্ণিত historicalতিহাসিকগুলির জন্য) তবে -pedanticতা করে:

foo.c:5:10: warning: parameter 'param' was not declared, 
defaulting to type 'int' [-pedantic]
int func(param)
         ^
1 warning generated.

এবং প্রোটোটাইপ ইস্যুটির জন্য উপরে যেমনটি আবার int func()বলা হয়েছে স্বেচ্ছাচারিত প্যারামিটারগুলি বোঝায় যদি না আপনি স্পষ্টভাবে এটি সংজ্ঞায়িত করেন int func(void)যা প্রত্যাশার মতো ত্রুটিগুলি দেয় তবে:

foo.c: In function func’:
foo.c:6:1: error: number of arguments doesnt match prototype
foo.c:3:5: error: prototype declaration
foo.c: In function main’:
foo.c:12:5: error: too many arguments to function func
foo.c:5:5: note: declared here

বা clangহিসাবে হিসাবে:

foo.c:5:5: error: conflicting types for 'func'
int func(param)
    ^
foo.c:3:5: note: previous declaration is here
int func(void);
    ^
foo.c:12:20: error: too many arguments to function call, expected 0, have 1
    int bla = func(10);
              ~~~~ ^~
foo.c:3:1: note: 'func' declared here
int func(void);
^
2 errors generated.

3

যদি ফাংশন ঘোষণার কোনও পরামিতি থাকে না অর্থাৎ খালি থাকে তবে এটি অনির্দিষ্ট সংখ্যক আর্গুমেন্ট নিচ্ছে। আপনি যদি এটি কোনও যুক্তি না নিতে চান তবে এটিকে এতে পরিবর্তন করুন:

int func(void);

1
"যদি ফাংশন প্রোটোটাইপের কোনও প্যারামিটার না থাকে" এটি কোনও ফাংশন প্রোটোটাইপ নয়, কেবল একটি ফাংশন ঘোষণা।
এফেফ

@ এফিফ তা ঠিক করে দিয়েছে। আমি বুঝতে পারিনি যে এই প্রশ্নটি খুব বেশি মনোযোগ পাবে;)
পিপি

3
"ফাংশন প্রোটোটাইপ" "ফাংশন ঘোষণার" জন্য কেবল একটি বিকল্প (সম্ভবত পুরানো ধাঁচের) প্রকাশ নয়?
জর্জিও

@ জর্জিও আইএমও, উভয়ই সঠিক। "ফাংশন প্রোটোটাইপ" "ফাংশন সংজ্ঞা" এর সাথে মেলে। আমি সম্ভবত মনে করি এফেফিকে প্রশ্নে ঘোষণার অর্থ এবং আমার উত্তরটিতে আমি কী বোঝাতে চাইছি।
পিপি

@Giorgio না, ফাংশন ঘোষণা রিটার্ন টাইপ মান, শনাক্তকারী এবং একটি দ্বারা তৈরি করা হয় ঐচ্ছিক প্যারামিটার তালিকা; ফাংশন প্রোটোটাইপগুলি পরামিতি তালিকার সাথে ফাংশন ঘোষণা decla
এফফিফ

0

এজন্য আমি সাধারণত লোকদের সাথে তাদের কোডটি সংকলন করার পরামর্শ দিই:

cc -Wmissing-variable-declarations -Wstrict-variable-declarations -Wold-style-definition

এই পতাকাগুলি কয়েকটি জিনিস প্রয়োগ করে:

  • -উমিসিং-ভেরিয়েবল-ডিক্লেয়ারেশন: প্রথমে প্রোটোটাইপ না পেয়ে স্থিতিশীল নন-ফাংশন ঘোষণা করা অসম্ভব। এটি আরও বেশি সম্ভাবনা তৈরি করে যে শিরোনাম ফাইলটিতে একটি প্রোটোটাইপ প্রকৃত সংজ্ঞাটির সাথে মেলে। বিকল্পভাবে, এটি কার্যকর করে যে আপনি স্থির কীওয়ার্ডটি ফাংশনগুলিতে যুক্ত করুন যা প্রকাশ্যে দৃশ্যমান হওয়ার দরকার নেই।
  • -স্ট্রিট-ভেরিয়েবল-ঘোষণা: প্রোটোটাইপটি সঠিকভাবে আর্গুমেন্টগুলির তালিকা করতে হবে।
  • -সামগ্রী-শৈলী-সংজ্ঞা: ফাংশন সংজ্ঞা নিজেও সঠিকভাবে যুক্তি তালিকাভুক্ত করতে হবে।

প্রচুর ওপেন সোর্স প্রকল্পগুলিতে এই পতাকাগুলি ডিফল্টরূপেও ব্যবহৃত হয়। উদাহরণস্বরূপ, আপনার মেকফাইলে ওয়ার্নস = 6 দিয়ে বিল্ডিং করার সময় ফ্রিবিএসডি এই পতাকাগুলি সক্ষম করেছে।

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