ফাংশন () এবং ফাংশন (শূন্য) এর মধ্যে পার্থক্য কী?


27

আমি শুনেছি যে ফাংশনগুলি এই জাতীয় প্যারামিটার হিসাবে কিছু না পায় তা লিখতে ভাল অনুশীলন:

int func(void);

তবে আমি শুনেছি যে প্রকাশের সঠিক উপায়টি এরকম:

int func();

সি এবং সি ++ উভয় ক্ষেত্রে এই দুটি ফাংশন ঘোষণার মধ্যে পার্থক্য কী?


5
এই সাইটটি নেটওয়ার্কে এক হাজার অন্য কোন প্রশ্ন সদৃশ হয়, অন্যদের মধ্যে stackoverflow.com/questions/18167390/...
লার্স Viklund

@ লার্স ভিক্লুন্ড এই সাইটে কোনও প্রশ্ন থাকলে এটি কেবল একটি সদৃশ। আমি একটি খুঁজে পাচ্ছি না, তাই এসও-তে যা আছে তা নির্বিশেষে, এটি কোনও সদৃশ নয়। সম্ভবত আর কিছু না থাকলে এই প্রশ্নটিকে একটি সাইনপোস্ট হিসাবে রাখে worth


1
@ লাইটনেসেসেসিনআরবিট আমরা আড্ডায় আলোচনা করেছি এবং কিছু সম্পাদনা করে এটিকে রাখার সিদ্ধান্ত নিয়েছি।

উত্তর:


17

সি এবং সি ++ এই ক্ষেত্রে আলাদা।

সি 2011 অনলাইন স্ট্যান্ডার্ড

7.7..6.৩ ফাংশন ডিক্লেটারগুলি (প্রোটোটাইপ সহ)
...
10 voidতালিকার একমাত্র আইটেম হিসাবে নামবিহীন পরামিতিগুলির বিশেষ ক্ষেত্রে নির্দিষ্ট করে যে ফাংশনের কোনও পরামিতি নেই।
...
14 একটি সনাক্তকারী তালিকা ফাংশনের পরামিতিগুলির সনাক্তকারীদের কেবলমাত্র ঘোষণা করে। ফাংশন ডিক্লেয়ারের একটি ফাঁকা তালিকা যা সেই ফাংশনের সংজ্ঞাটির অংশ এটি নির্দিষ্ট করে যে ফাংশনের কোনও প্যারামিটার নেই। কোনও ফাংশন ডিক্লেয়ারের খালি তালিকা যা সেই ফাংশনের সংজ্ঞাটির অংশ নয় এটি নির্দিষ্ট করে যে পরামিতিগুলির সংখ্যা বা প্রকার সম্পর্কে কোনও তথ্য সরবরাহ করা হয়নি। 145)

সংক্ষেপে, একটি ফাংশন ঘোষণায় একটি খালি প্যারামিটার তালিকা নির্দেশ করে যে ফাংশনটি একটি অনির্দিষ্ট পরামিতি নেয় , অন্যদিকে কোনও ফাংশন সংজ্ঞায় একটি খালি পরামিতি তালিকা নির্দেশ করে যে ফাংশনটি কোনও পরামিতি নেয় না

T foo( void ); // declaration, foo takes no parameters
T bar();       // declaration, bar takes an *unspecified* number of parameters

T foo( void ) { ... } // definition, foo takes no parameters
T bar() { ... }       // definition, bar takes no parameters

যতদূর সি সম্পর্কিত, আপনার কোনও ক্রিয়াকলাপের ঘোষণা বা সংজ্ঞায় খালি শনাক্তকারী তালিকা ব্যবহার করা উচিত নয় । যদি কোনও ফাংশন কোনও প্যারামিটার নিতে না voidহয় তবে পরামিতি তালিকায় এটি নির্দিষ্ট করে ।

অনলাইন সি ++ স্ট্যান্ডার্ড

8.3.5 ফাংশন [dcl.fct]
...
4 পরামিতি-ঘোষণার-ধারাটি নির্দিষ্ট করা যেতে পারে এমন আর্গুমেন্টগুলি এবং তাদের প্রসেসিং, যখন ফাংশন বলা হয় তখন তা নির্ধারণ করে। [ নোট: প্যারামিটার-ঘোষণা-দফা আর্গুমেন্ট ফাংশন কল উল্লিখিত রূপান্তর করতে ব্যবহার করা হয়; 5.2.2 দেখুন। - শেষ দ্রষ্টব্য ] যদি প্যারামিটার-ঘোষণা-ধারাটি খালি থাকে তবে ফাংশনটি কোনও আর্গুমেন্ট নেয় না। অ-নির্ভরশীল ধরণের একক নামবিহীন প্যারামিটার voidসমন্বিত একটি প্যারামিটার তালিকা খালি প্যারামিটার তালিকার সমতুল্য। এই বিশেষ ক্ষেত্রে ব্যতীত, কোনও প্যারামিটারের ধরণ থাকবে না cv void। যদি প্যারামিটার-ঘোষণা-ধারাএকটি উপবৃত্ত বা একটি ফাংশন প্যারামিটার প্যাক (14.5.3) দিয়ে সমাপ্ত হয়, আর্গুমেন্টের সংখ্যা প্যারামিটারের সংখ্যার সমান বা তার চেয়ে বেশি হবে যেগুলির ডিফল্ট যুক্তি নেই এবং ফাংশন প্যারামিটার প্যাকগুলি নেই। যেখানে সিনথেটিকভাবে সঠিক এবং যেখানে "..." কোনও বিমূর্ত-ঘোষণাকারীর অংশ নয় , ", ..." "..." এর সমার্থক শব্দ। [ উদাহরণ: ঘোষণা
    int printf(const char*, ...);
একটি ফাংশন ঘোষণা করে যা বিভিন্ন সংখ্যা এবং আর্গুমেন্টের ধরণের সাথে ডাকা যেতে পারে।
    printf("hello world");
    printf("a=%d b=%d", a, b);
যাইহোক, প্রথম যুক্তি অবশ্যই একটি প্রকারের হতে হবে যা একটি const char*- শেষ উদাহরণে রূপান্তর করা যায় ] [ দ্রষ্টব্য: স্ট্যান্ডার্ড শিরোনামে <cstdarg>উপবৃত্ত ব্যবহার করে পাস করা আর্গুমেন্ট অ্যাক্সেসের জন্য একটি ব্যবস্থা রয়েছে (দেখুন 5.2.2 এবং 18.10)। - শেষ নোট ]

সি ++ এর ক্ষেত্রে, ঘোষণাপত্র বা সংজ্ঞায়িত হয় ফাঁকা প্যারামিটার তালিকাটি ইঙ্গিত দেয় যে ফাংশনটি কোনও আর্গুমেন্ট নেয় না, এবং এর পরামিতি তালিকা ব্যবহারের সমতুল্য void


35

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

সি তে, পরামিতি তালিকার একটি ফাংশন (void)স্পষ্টভাবে তার যুক্তিগুলির জন্য কিছুই নেয় না । এর অর্থ আপনি যদি কিছু পাস করার চেষ্টা করেন তবে সংকলকটি আপনাকে বলতে পারে যে আপনি ভুল করেছেন actually

সি ++ এ, এই ফাংশন ঘোষণাগুলি সমতুল্য। একটি খালি প্যারামিটার তালিকার অর্থ "কোনও পরামিতি নেই" এর মতোই void


পুনঃ: "এটি সাধারণত কোনও ফাংশন বাস্তবায়নের জন্য ব্যবহৃত হয় যা পরিবর্তনশীল সংখ্যক আর্গুমেন্ট নিতে পারে": আপনি কি এ সম্পর্কে নিশ্চিত? আমি কখনও মনে করি না যে আমি এমন কোনও প্রোগ্রাম দেখেছি যা অ-বৈকল্পিক ফাংশনগুলির ফরোয়ার্ড-ঘোষণার জন্য এবং বৈকল্পিকগুলির জন্য সুস্পষ্ট প্যারামিটার-তালিকা ব্যবহার করেছিল ()। আপনার কাছে এমন কোনও প্রোগ্রামের উদাহরণ রয়েছে যা এই সম্মেলনটি ব্যবহার করে?
রুখ

4
এসি variadic ফাংশন আবশ্যক সঙ্গে সংজ্ঞায়িত করা ...সিনট্যাক্স, এবং এটি অন্তত একটি নামে প্যারামিটার থাকা আবশ্যক। এ জাতীয় ফাংশন সংজ্ঞায়িত করে অপরিবর্তিত ()আচরণের কারণ - এবং <stdarg.h>প্যারামিটারের মানগুলি পড়ার জন্য সংজ্ঞায়িত ম্যাক্রোগুলি ব্যবহারের কোনও উপায় নেই function 1989/1990 স্ট্যান্ডার্ডের পরে থেকে এটি ঘটেছে।
কিথ থম্পসন

@ কিথথম্পসন: এই প্রশ্নটি এবং এই উত্তরটি পূর্বনির্ধারণের কথা বলছে, ফাংশন সংজ্ঞা নয়।
রূখ

3
@রুখ: অপরিবর্তিত আচরণ এড়াতে সিনট্যাক্স ব্যবহার করে একটি বৈকল্পিক ফাংশন অবশ্যই ঘোষণা এবং সংজ্ঞায়িত করা উচিত ...
কিথ থম্পসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.