সি ++ বা সি-তে foo (অকার্যকর) এবং foo () এর মধ্যে কি পার্থক্য রয়েছে?


253

এই দুটি কার্য সংজ্ঞা বিবেচনা করুন:

void foo() { }

void foo(void) { }

এই দুজনের মধ্যে কি কোনও পার্থক্য আছে? যদি তা না হয় তবে voidতর্ক কেন সেখানে? নান্দনিক কারণে?


সি এর জন্য প্রশ্ন / এ এখানে
অ্যান্টি হাপাল

উত্তর:


317

ইন সি :

  • void foo()এর অর্থ " fooঅনির্ধারিত ধরণের আর্গুমেন্টের একটি অনির্দিষ্ট সংখ্যক ক্রিয়া গ্রহণ করা"
  • void foo(void)এর অর্থ " fooকোন তর্ক নেই কোন ক্রিয়া "

ইন সি ++ :

  • void foo()এর অর্থ " fooকোন তর্ক নেই কোন ক্রিয়া "
  • void foo(void)এর অর্থ " fooকোন তর্ক নেই কোন ক্রিয়া "

foo(void)সুতরাং, লিখে , আমরা উভয় ভাষায় একই ব্যাখ্যা অর্জন করি এবং আমাদের শিরোনামকে বহুভাষিক করে তুলি (যদিও সাধারণত শিরোনামকে সত্যিকার অর্থে ভাষা তৈরি করার জন্য আমাদের সাধারণত আরও কিছু কাজ করার প্রয়োজন হয়; যথা, extern "C"আমরা যদি সংকলন করে থাকি তবে এগুলিকে আবদ্ধ করে রাখি সি ++)।


10
তবে সি ++ এর যদি প্রয়োজন হয় voidতবে এটি "সর্বাধিক ভেক্সিং পার্স" সমস্যাটি এড়াতে পারত।
অ্যাড্রিয়ান ম্যাকার্থি

5
সত্য, তবে সি ++ তে আরও অনেক ক্রেপি পার্স রয়েছে যার মধ্যে কোনও একটি সম্পর্কে কেভেচিংয়ের আসল বক্তব্য নেই।
ড্রিপজা

16
সাম্প্রতিক প্রশ্নে @ জেমস কানজে একটি মজাদার টিডিবিট পোস্ট করেছেন। এটি হারাতে এড়াতে এখানে পুনরায় পোস্ট করুন: সি এর প্রথম সংস্করণগুলি কোনও ফাংশন গ্রহণ করতে পারে এমন প্যারামিটারের সংখ্যা নির্দিষ্ট করার অনুমতি দেয়নি, সুতরাং void foo()এটি কোনও ফাংশন ঘোষণা করার একমাত্র সিনট্যাক্স ছিল। স্বাক্ষরগুলি যেখানে চালু হয়েছিল, সি কমিটি পুরানো বাক্য গঠন থেকে নো-প্যারামিটার ছিন্ন করতে হবে এবং void foo(void)সিনট্যাক্সটি প্রবর্তন করতে হয়েছিল । সি ++ এটি সামঞ্জস্যের জন্য নিয়েছে।
ম্যাথিউ এম।

3
আপনি আমাকে সি সি 90 এর উদাহরণ দিতে পারেন এবং তার পরে যেখানে ব্যবহারের void foo()পরিবর্তে void foo(void)কার্যকরী পার্থক্য দেখা দেয়? আমি বহু বছর ধরে শূন্যতা ছাড়াই সংস্করণটি ব্যবহার করে আসছি এবং কোন সমস্যা দেখিনি, আমি কি কিছু অনুভব করছি?
chacham15

6
@ চ্যাচাম ১৫ void foo() { if ( rand() ) foo(5); } সংকলন করে এবং রান করে (আপনি খুব ভাগ্যবান না হওয়া পর্যন্ত অপরিজ্ঞাত আচরণের কারণ হয়ে দাঁড়ান ), অন্যদিকে void foo(void)একই শরীরের সাহায্যে সংকলনের ত্রুটি ঘটবে।
এমএম

39

আমি বুঝতে পারি আপনার প্রশ্নটি সি ++ এর সাথে সম্পর্কিত, তবে এটি যখন সি এ আসে তখন উত্তরটি কে ওআর, পৃষ্ঠা 72২- 7273 এ পাওয়া যাবে:

তদুপরি, যদি কোনও ফাংশন ঘোষণায় যুক্তিগুলি অন্তর্ভুক্ত না হয় তবে

double atof();

তারও অর্থ এই হিসাবে নেওয়া হয়েছে যে এটির পক্ষে যুক্তি সম্পর্কে কিছুই অনুমান করা উচিত নয়; সমস্ত প্যারামিটার চেকিং বন্ধ আছে। খালি যুক্তি তালিকার এই বিশেষ অর্থটি পুরানো সি প্রোগ্রামগুলিকে নতুন সংকলকগুলির সাথে সংকলনের অনুমতি দেওয়ার উদ্দেশ্যে to তবে এটি নতুন প্রোগ্রামগুলির সাথে ব্যবহার করা খারাপ ধারণা। যদি ফাংশনটি আর্গুমেন্ট নেয়, তাদের ঘোষণা করুন; যদি এটি কোনও যুক্তি না নেয় তবে অকার্যকর ব্যবহার করুন।


তবে প্রশ্নটি সংজ্ঞা সম্পর্কিত, সেই ক্ষেত্রে প্রাসঙ্গিক সি নিয়মটি কোনও ফাংশন ডিক্লেয়ারের একটি ফাঁকা তালিকা যা এই ফাংশনের সংজ্ঞাটির অংশ এটি নির্দিষ্ট করে যে ফাংশনের কোনও প্যারামিটার নেই।
jinwee

9

সি ++ 11 এন 3337 স্ট্যান্ডার্ড খসড়া

এখানে কোন পার্থক্য নেই.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

সংযুক্তি সি "সামঞ্জস্যতা" C.1.7 ধারা 8: ঘোষকগণ বলেছেন:

8.3.5 পরিবর্তন: সি ++ এ, খালি প্যারামিটার তালিকার সাথে ঘোষিত একটি ফাংশন কোনও আর্গুমেন্ট নেয় না। সি-তে, খালি প্যারামিটার তালিকার অর্থ ফাংশন আর্গুমেন্টগুলির সংখ্যা এবং ধরণের অজানা।

উদাহরণ:

int f();
// means int f(void) in C ++
// int f( unknown ) in C

যুক্তিযুক্ত: এটি ভ্রান্ত ফাংশন কলগুলি এড়ানোর জন্য (যেমন, ভুল নম্বর বা যুক্তির ধরণের সাথে ফাংশন কলগুলি)।

মূল বৈশিষ্ট্যের উপর প্রভাব: সুনির্দিষ্ট সংজ্ঞাযুক্ত বৈশিষ্ট্যের শব্দার্থবিজ্ঞানে পরিবর্তন। এই বৈশিষ্ট্যটি সিতে "অপ্রচলিত" হিসাবে চিহ্নিত করা হয়েছিল

8.5.3 ফাংশন বলেছেন:

৪. প্যারামিটার-ডিক্লেয়ারেশন-ক্লজটি নির্দিষ্ট করা যেতে পারে এমন আর্গুমেন্টগুলি এবং তাদের প্রসেসিং, যখন ফাংশনটি বলা হয় তখন তা নির্ধারণ করে। [...] যদি প্যারামিটার-ঘোষণা-ধারাটি খালি থাকে তবে ফাংশনটি কোনও আর্গুমেন্ট নেয় না। পরামিতি তালিকা (অকার্যকর) খালি প্যারামিটার তালিকার সমান।

C99

সি ++ 11 দ্বারা উল্লিখিত হিসাবে int f()আর্গুমেন্টগুলি সম্পর্কে কিছুই নির্দিষ্ট করে না এবং অপ্রচলিত।

এটি হয় ওয়ার্কিং কোড বা ইউবি হতে পারে।

আমি সি 99 মানটি এখানে বিশদভাবে ব্যাখ্যা করেছি: https://stackoverflow.com/a/36292431/895245


2

সি তে, আপনি একটি খালি ফাংশন রেফারেন্সে একটি শূন্যতা ব্যবহার করেন যাতে কম্পাইলারের একটি প্রোটোটাইপ থাকে এবং সেই প্রোটোটাইপের "কোনও যুক্তি নেই"। সি ++ এ আপনাকে সংকলকটি বলতে হবে না যে আপনার কাছে প্রোটোটাইপ রয়েছে কারণ আপনি প্রোটোটাইপটি ছেড়ে যেতে পারেন না।


1
"প্রোটোটাইপ" অর্থ যুক্তি তালিকার ঘোষণা এবং রিটার্নের ধরণ। আমি এটি বলছি কারণ "প্রোটোটাইপ" আমাকে প্রথমে আপনি কী বোঝাতে চেয়েছিলেন তা সম্পর্কে আমাকে বিভ্রান্ত করেছে।
জ্যান লিংস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.