একটি ফাংশন নামের চারপাশের অর্থ কী?


214

আমার প্রকল্পের উত্স ফাইলগুলির একটিতে আমি এই সি ফাংশন সংজ্ঞাটি পেয়েছি:

int (foo) (int *bar)
{
    return foo (bar);
}

দ্রষ্টব্য: পাশের কোনও নক্ষত্রমুখে নেই foo, সুতরাং এটি কোনও ফাংশন পয়েন্টার নয়। অথবা এটা? পুনরাবৃত্তি কল দিয়ে এখানে কি চলছে?


7
না এটি কোনও ফাংশন পয়েন্টার নয় - এটি এখনও ফু নামে একটি নিয়মিত ফাংশন।
নেমানজা বোরিক

এটি কি সম্পূর্ণ কাজ?
asheeshr

2
আপনার কাছে কি প্রমাণ আছে যে এই ফাংশনটি একটি দরকারী প্রসঙ্গে ব্যবহৃত হয়েছে?
moooeeeep

1
... এমন কিছু ডামি ফাংশনের মতো মনে হচ্ছে এটি বিদ্যমান সূত্রে কম্পাইল করে কিনা তা সবেমাত্র এটি লেখা হয়েছিল এবং এটি সরিয়ে নেওয়া উচিত ছিল। আমি এটিকে সরিয়ে ফেলব (যদি এটি ফাংশনটি সত্যই করে তবে) যেহেতু সর্বোপরি এটি অসীম লুপ হবে (আমি নিশ্চিত নই যে সি সংকলকটি এই লেজের কলটিকে ঝাঁপিয়ে দেওয়ার জন্য অনুমতি দেয় কিনা), খারাপ স্ট্যাক ওভারফ্লোতে।
হাইড

3
সি ঘোষণাপত্রের প্যারেন্টিহেসগুলি ভাষার অস্পষ্টতাকে সামঞ্জস্য করতে সহায়তা করে। তাড়াতাড়ি, কী a(b);? bধরণের পরিবর্তনশীল হিসাবে ঘোষণা a? বা aযুক্তি দিয়ে কাজ করার জন্য একটি কল b? পার্থক্যটি সিনট্যাকটিক এবং আপনি কীভাবে কোন উপায়টি এমনকি ঘোষণার তথ্য অনুসন্ধান না করে পার্স করতে পারবেন তাও জানেন না a; অর্থাত্ সেই পোস্টফিক্স ফাংশনটি কল বন্ধনী, বা কোনও ঘোষণাকারীর চারপাশে alচ্ছিক বন্ধনী।
কাজ

উত্তর:


329

কোনও প্রিপ্রসেসর সামগ্রীর অভাবে, fooএর স্বাক্ষর সমান

int foo (int *bar)

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

এই অনুশীলনটি প্রথমে কিছুটা অদ্ভুত বলে মনে হতে পারে তবে সি গ্রন্থাগারটি অভিন্ন নামের সাথে কিছু ম্যাক্রো এবং ফাংশন সরবরাহ করে একটি নজির স্থাপন করে ।

এরকম একটি ফাংশন / ম্যাক্রো জুটি isdigit()। গ্রন্থাগারটি এটি নিম্নলিখিত হিসাবে সংজ্ঞায়িত করতে পারে:

/* the macro */
#define isdigit(c) ...

/* the function */
int (isdigit)(int c) /* avoid the macro through the use of parentheses */
{
  return isdigit(c); /* use the macro */
}

আপনার ফাংশন উপরের মত প্রায় একই দেখায়, তাই আমি সন্দেহ করি এটি আপনার কোডেও কি ঘটছে suspect


2
এখানেও এটি হতে পারে; আমি ম্যাক্রোগুলি খুঁজিনি ... এবং আমি জানতাম না যে ম্যাক্রো সম্প্রসারণ বন্ধনীগুলির মধ্যে হয় না, এটি নির্দেশ করার জন্য ধন্যবাদ!
ব্যবহারকারী 1859094

13
@ ব্যবহারকারী 1859094: দ্বিতীয় বর্ণনায়, এটি আপনার কোডে যা চলছে তা প্রায় অবশ্যই। foo(bar)ফাংশন ভিতরে সংশ্লিষ্ট ম্যাক্রো ব্যবহার করছে।
এনপিই

78
@ ব্যবহারকারী 1859094 ম্যাক্রো এক্সপেনশনটি প্রথম বন্ধনীগুলির মধ্যে সংঘটিত হয় তবে ফাংশনের মতো ম্যাক্রোর সম্প্রসারণ কেবল তখনই হয় যখন পরবর্তী টোকেনটি একটি বাম বন্ধনী (C99, 6.10.3§10) হয়, সুতরাং foo (int* bar)পরিবর্তিত হবে, তবে (foo) (int *bar)(পরবর্তী টোকেন) পরে fooহয় ))
Virgile

4
কিভাবে এই ধরনের একটি ফাংশন বলা হবে? আপনি কি এটিকে প্রথম বন্ধনী হিসাবে কল করবেন? উদাহরণস্বরূপ, এটি কাজ করবে: (isdigit)(5)?
gcochard

4
@ গ্রেগ: ঠিক আছে, আপনি একে ঠিক এভাবেই ডাকবেন।
এনপিই

37

Parantheses ঘোষণা পরিবর্তন করবেন না - এটা এখনও ঠিক নামক একটি সাধারণ ফাংশন সংজ্ঞায়িত হচ্ছে foo

এগুলি যে কারণে ব্যবহৃত হয়েছিল তা অবশ্যই অবশ্যই কারণ এখানে একটি ফাংশনের মতো ম্যাক্রো fooসংজ্ঞায়িত রয়েছে:

#define foo(x) ...

(foo)ফাংশন ঘোষণায় ব্যবহার করা এই ম্যাক্রোটিকে এখানে প্রসারিত হতে বাধা দেয়। সুতরাং সম্ভবত যা ঘটছে তা হ'ল কোনও ফাংশনটিকে foo()তার দেহের সাথে ফাংশনের মতো ম্যাক্রো থেকে প্রসারিত করার সাথে সংজ্ঞা দেওয়া হচ্ছে foo


5
দুর্দান্ত ছাড় (যদিও এই উদ্দেশ্যে প্রথম বন্ধনী ব্যবহার করা আইন অনুসারে শাস্তিযোগ্য হওয়া উচিত)।
ugoren

3
@ ইউগোরেন: ফাংশন নামের চারপাশে প্যারেন্স ব্যবহার করা কোনও ফাংশনের মতো ম্যাক্রোর জন্য ম্যাক্রো সম্প্রসারণ রোধের একমাত্র উপায়। অনেক সময় এটি একটি প্রয়োজনীয় সরঞ্জাম।
মাইকেল বুড়

7
@ মিশেলবার, ম্যাক্রো না থাকার এবং একই নামের সাথে কাজ করার বিকল্প রয়েছে। আমি জানি আপনি সর্বদা সব কিছু নিয়ন্ত্রণ করতে পারবেন না, তবে আপনি যদি এই সমাধানে পৌঁছে থাকেন তবে আমি বলি কিছু খুব ভুল।
ugoren

-3

প্রথম বন্ধনী অর্থহীন।
আপনার প্রদর্শিত কোডটি অসীম পুনরাবৃত্তি ছাড়া কিছুই নয় nothing

কোনও ফাংশন পয়েন্টারটি সংজ্ঞায়িত করার সময় আপনি কখনও কখনও অদ্ভুত বন্ধনী দেখতে পান যা কিছু বোঝায়। তবে এখানে বিষয়টি নেই isn't


6
স্পষ্টতই নয়; প্রথম বন্ধনী ম্যাক্রো প্রসার রোধ করে। গৃহীত উত্তর দেখুন।
কেভিন

12
কেভিন, আমার উত্তরটি দেখানো কোড সম্পর্কে এবং এটির জন্য সঠিক। এখানে প্রায় কোনও সি প্রশ্নে, ধরে নেই অজানা প্রিপ্রোসেসর সংজ্ঞাগুলি সমস্ত কিছু পরিবর্তন করতে পারে। এই ক্ষেত্রে, প্রিপ্রোসেসর হিসাবে বিবেচিত উত্তরগুলি প্রকৃতপক্ষে আরও ভাল তবে এটি আমার ভুল করে না।
ugoren
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.