আমরা সিতে নেস্টেড ফাংশন রাখতে পারি? নেস্টেড ফাংশনগুলির ব্যবহার কী? যদি তারা সি তে বিদ্যমান থাকে তবে তাদের বাস্তবায়ন কি সংকলক থেকে সংকলক থেকে আলাদা হয়?
আমরা সিতে নেস্টেড ফাংশন রাখতে পারি? নেস্টেড ফাংশনগুলির ব্যবহার কী? যদি তারা সি তে বিদ্যমান থাকে তবে তাদের বাস্তবায়ন কি সংকলক থেকে সংকলক থেকে আলাদা হয়?
উত্তর:
আপনি স্ট্যান্ডার্ড সি-তে অন্য ফাংশনের মধ্যে কোনও ফাংশন সংজ্ঞায়িত করতে পারবেন না
আপনি কোনও ফাংশনের অভ্যন্তরে কোনও ক্রিয়াকলাপ ঘোষণা করতে পারেন তবে এটি কোনও নেস্টেড ফাংশন নয়।
জিসিসির একটি ভাষা বর্ধন রয়েছে যা নেস্টেড ফাংশনগুলিকে মঞ্জুরি দেয় । এগুলি মানহীন, এবং এগুলি সম্পূর্ণ সংকলক নির্ভর।
না, সেগুলিতে সি নেই
এগুলি দুটি কারণে (কমপক্ষে) পাস্কালের মতো ভাষায় ব্যবহৃত হয়:
নেস্টেড ফাংশন একটি অংশ নয় ANSI সি অবশ্য তারা অংশ GNU C ।
না আপনি একটি নেস্টেড ফাংশন থাকতে পারে না C
। আপনি যে নিকটে আসতে পারেন তা হ'ল অন্য ফাংশনের সংজ্ঞায়নের ভিতরে একটি ফাংশন ঘোষণা করা। যদিও এই ফাংশনটির সংজ্ঞাটি অন্য কোনও ফাংশন বডিটির বাইরে উপস্থিত থাকতে হবে।
যেমন
void f(void)
{
// Declare a function called g
void g(void);
// Call g
g();
}
// Definition of g
void g(void)
{
}
g
ফাইলটি পরে দেখা যায় যে ঘোষণাটি বাকী অনুবাদ ইউনিটের জন্য সুযোগ রয়েছে scope এছাড়াও আপনি সিতে ফাংশনগুলিকে স্কোপটিতে দৃশ্যমান ঘোষণা ছাড়াই কল করতে পারেন যদিও এটি উপযুক্ত না হয়।
আমি এটি উল্লেখ করছি যেহেতু সিতে কোডিং করা অনেক লোক এখন এটি করতে C ++ সংকলক (যেমন ভিজ্যুয়াল সি ++ এবং কেইল ইউভিশন) ব্যবহার করছে, যাতে আপনি এটি ব্যবহার করতে সক্ষম হতে পারেন ...
যদিও সি তে এখনও অনুমোদিত নয়, আপনি যদি সি ++ ব্যবহার করেন তবে সি ++ 11-এ প্রবর্তিত ল্যাম্বদা ফাংশনগুলির সাথে আপনি একই প্রভাব অর্জন করতে পারেন:
void f()
{
auto g = [] () { /* Some functionality */ }
g();
}
অন্যরা যেমন উত্তর দিয়েছে, স্ট্যান্ডার্ড সি নেস্টেড ক্রিয়াকলাপ সমর্থন করে না।
নেস্টেড ফাংশনগুলি কয়েকটি ভাষায় একাধিক ফাংশন এবং ভেরিয়েবলগুলি একটি ধারক (বাইরের ফাংশন) এ সংযুক্ত করার জন্য ব্যবহৃত হয় যাতে পৃথক ফাংশন (বাহ্যিক ফাংশন বাদে) এবং ভেরিয়েবলগুলি বাইরে থেকে দেখা যায় না।
ইন সি , এই একটি পৃথক সোর্স ফাইল যেমন ফাংশন নির্বাণ দ্বারা সম্পন্ন করা যেতে পারে। মূল কার্যটি গ্লোবাল এবং অন্যান্য সমস্ত ফাংশন এবং ভেরিয়েবলকে স্থির হিসাবে সংজ্ঞায়িত করুন । এই মডিউলটির বাইরে এখন কেবলমাত্র প্রধান ফাংশন দৃশ্যমান।
outer
-> nested
-> outer
-> থাকে nested
, তবে সেখানে দুটি আলাদা ফ্রেম হোল্ডিং থাকবে int declared_in_outer
, সুতরাং আপনি কেবল declared_in_outer
একটি স্থির গ্লোবাল হিসাবে রাখতে পারবেন না ।
আপনার দ্বিতীয় প্রশ্নের উত্তর দেওয়ার জন্য, এমন ভাষা রয়েছে যা নেস্টেড ফাংশনগুলি সংজ্ঞায়িত করতে দেয় (একটি তালিকা এখানে পাওয়া যাবে: নেস্টেড-ফাংশন-ভাষা-তালিকা-উইকিপিডিয়া )।
জাভাস্ক্রিপ্টে, যা সেই ভাষাগুলির মধ্যে সর্বাধিক বিখ্যাত, নেস্টেড ফাংশনগুলির মধ্যে একটি হতে পারে (যা ক্লোজার বলা হয়):
কিছু নাম রাখা ...
অথবা আপনি এটি সম্পর্কে স্মার্ট হতে পারেন এবং আপনার সুবিধার জন্য প্রিপ্রসেসর ব্যবহার করতে পারেন ( source.c
):
#ifndef FIRSTPASS
#include <stdio.h>
//here comes your "nested" definitions
#define FIRSTPASS
#include "source.c"
#undef FIRSTPASS
main(){
#else
int global = 2;
int func() {printf("%d\n", global);}
#endif
#ifndef FIRSTPASS
func();}
#endif
এটি কি সি-তে কোনও নেস্টেড ফাংশন নয়? (ফাংশন ডিসপ্লে অ্যাকাউন্টস ())
আমি জানি যে আমি ফাংশনটি আলাদাভাবে সংজ্ঞায়িত করতে পারতাম এবং ভেরিয়েবলগুলি পাস করতে পারি এবং একাধিকবার অ্যাকাউন্টগুলি মুদ্রণের জন্য আমার কী প্রয়োজন তা ভালভাবে কাজ করে না।
(স্কুল অ্যাসাইনমেন্ট থেকে নেওয়া স্নিপেট) ...
//function 'main' that executes the program.
int main(void)
{
int customerArray[3][3] = {{1, 1000, 600}, {2, 5000, 2500}, {3, 10000, 2000}}; //multidimensional customer data array.
int x, y; //counters for the multidimensional customer array.
char inquiry; //variable used to store input from user ('y' or 'n' response on whether or not a recession is present).
//function 'displayAccounts' displays the current status of accounts when called.
void displayAccounts(void)
{
puts("\t\tBank Of Despair\n\nCustomer List:\n--------------");
puts("Account # Credit Limit\t Balance\n--------- ------------\t -------");
for(x = 0; x <= 2; x++)
{
for(y = 0; y <= 2; y++)
printf("%9d\t", customerArray[x][y]);
puts("\n");
}
}
displayAccounts(); //prints accounts to console.
printf("Is there currently a recession (y or n)? ");
//...
return 0;
}