সি মধ্যে নেস্টেড ফাংশন


97

আমরা সিতে নেস্টেড ফাংশন রাখতে পারি? নেস্টেড ফাংশনগুলির ব্যবহার কী? যদি তারা সি তে বিদ্যমান থাকে তবে তাদের বাস্তবায়ন কি সংকলক থেকে সংকলক থেকে আলাদা হয়?


4
: এর একটি ডুপ্লিকেট মনে করা হয় stackoverflow.com/questions/1348095/...
zoli2k

উত্তর:


112

আপনি স্ট্যান্ডার্ড সি-তে অন্য ফাংশনের মধ্যে কোনও ফাংশন সংজ্ঞায়িত করতে পারবেন না

আপনি কোনও ফাংশনের অভ্যন্তরে কোনও ক্রিয়াকলাপ ঘোষণা করতে পারেন তবে এটি কোনও নেস্টেড ফাংশন নয়।

জিসিসির একটি ভাষা বর্ধন রয়েছে যা নেস্টেড ফাংশনগুলিকে মঞ্জুরি দেয় । এগুলি মানহীন, এবং এগুলি সম্পূর্ণ সংকলক নির্ভর।


36

না, সেগুলিতে সি নেই

এগুলি দুটি কারণে (কমপক্ষে) পাস্কালের মতো ভাষায় ব্যবহৃত হয়:

  1. তারা নাম স্থানগুলিকে দূষিত না করে কার্যকরী পচনের অনুমতি দেয়। আপনি একটি একক প্রকাশ্যে দৃশ্যমান ফাংশন সংজ্ঞায়িত করতে পারেন যা সমস্যাটিকে ছোট, লজিকাল টুকরো টুকরো করার জন্য এক বা একাধিক নেস্টেড ফাংশনগুলির উপর নির্ভর করে কিছু জটিল যুক্তি প্রয়োগ করে।
  2. এগুলি কিছু ক্ষেত্রে প্যারামিটারকে সহজতর করে। একটি নেস্টেড ফাংশনটির সমস্ত প্যারামিটার এবং কিছু বা সমস্ত বাহ্যিক ফাংশনের ক্ষেত্রের ভ্যারিয়েবলগুলির অ্যাক্সেস রয়েছে, সুতরাং বাইরের ফাংশনটি স্পষ্টভাবে নেস্টেড ফাংশনে স্থানীয় রাষ্ট্রের একটি গাদা পাস করতে হবে না।

21

নেস্টেড ফাংশন একটি অংশ নয় ANSI সি অবশ্য তারা অংশ GNU C


তারা জ্ঞান সি
শচীন চৌরাসিয়া

4
@ সাচিন বুঝতে পেরেছেন কেন নেস্টেড ফাংশন সহ সি কোডটি জিসিসি দিয়ে সংকলন করা যায়। তথ্যের শিক্ষাগত মূল্য রয়েছে। অধিকন্তু, প্রশ্নটি নির্দিষ্ট করে না যদি এটি কেবল C89, C99 বা GNU C
zoli2k

4
জিসিসি দ্বারা সমর্থিত অন্যান্য ভাষাগুলিতে সেগুলি রয়েছে (এডিএ এবং পাসক্যাল যা আমি জানি), সুতরাং সম্ভবত এটি কার্যকর হয় যে সি প্রয়োগকারীতে যুক্ত হওয়া সহজ ছিল বা এটি সি যুক্ত করা হয়েছিল যাতে কোন ভাষা সমর্থন করার প্রস্তুতি তৈরি করতে পারে? তাদের প্রয়োজন
এনট্রেজেস

ম্যাটল্যাবও নেস্টেড ফাংশন রয়েছে।
মাইকট্রোনিক্স

17

না আপনি একটি নেস্টেড ফাংশন থাকতে পারে না C। আপনি যে নিকটে আসতে পারেন তা হ'ল অন্য ফাংশনের সংজ্ঞায়নের ভিতরে একটি ফাংশন ঘোষণা করা। যদিও এই ফাংশনটির সংজ্ঞাটি অন্য কোনও ফাংশন বডিটির বাইরে উপস্থিত থাকতে হবে।

যেমন

void f(void)
{
    // Declare a function called g
    void g(void);

    // Call g
    g();
}

// Definition of g
void g(void)
{
}

6
যদি ফাংশন জি এইভাবে ঘোষিত হয়, তবে এর সুযোগ কী হবে?
শচীন চৌরাসিয়া

6
ঘোষণাটি অন্য কোনও ঘোষণার মতোই বাদ দেওয়া হয়, সুতরাং ফাংশন শেষ হওয়া পর্যন্ত এই ক্ষেত্রে। অবশ্যই একবার সংজ্ঞায়িত gফাইলটি পরে দেখা যায় যে ঘোষণাটি বাকী অনুবাদ ইউনিটের জন্য সুযোগ রয়েছে scope এছাড়াও আপনি সিতে ফাংশনগুলিকে স্কোপটিতে দৃশ্যমান ঘোষণা ছাড়াই কল করতে পারেন যদিও এটি উপযুক্ত না হয়।
সিবি বেইলি

5

আমি এটি উল্লেখ করছি যেহেতু সিতে কোডিং করা অনেক লোক এখন এটি করতে C ++ সংকলক (যেমন ভিজ্যুয়াল সি ++ এবং কেইল ইউভিশন) ব্যবহার করছে, যাতে আপনি এটি ব্যবহার করতে সক্ষম হতে পারেন ...

যদিও সি তে এখনও অনুমোদিত নয়, আপনি যদি সি ++ ব্যবহার করেন তবে সি ++ 11-এ প্রবর্তিত ল্যাম্বদা ফাংশনগুলির সাথে আপনি একই প্রভাব অর্জন করতে পারেন:

void f()
{
    auto g = [] () { /* Some functionality */ }

    g();
}

4
প্রশ্নটি বিশেষত সি সম্পর্কে ছিল, সি ++ নয়
ভার্জিল

11
@ ভার্জিল - এবং প্রশ্নটিতেও স্পষ্টভাবে বলা হয়েছে "অন্য কোন ভাষায় নেস্টেড ফাংশনগুলি অনুমোদিত?" জনের উত্তর আমাকে সাহায্য করেছিল।
www-0av-Com

3

অন্যরা যেমন উত্তর দিয়েছে, স্ট্যান্ডার্ড সি নেস্টেড ক্রিয়াকলাপ সমর্থন করে না।

নেস্টেড ফাংশনগুলি কয়েকটি ভাষায় একাধিক ফাংশন এবং ভেরিয়েবলগুলি একটি ধারক (বাইরের ফাংশন) এ সংযুক্ত করার জন্য ব্যবহৃত হয় যাতে পৃথক ফাংশন (বাহ্যিক ফাংশন বাদে) এবং ভেরিয়েবলগুলি বাইরে থেকে দেখা যায় না।

ইন সি , এই একটি পৃথক সোর্স ফাইল যেমন ফাংশন নির্বাণ দ্বারা সম্পন্ন করা যেতে পারে। মূল কার্যটি গ্লোবাল এবং অন্যান্য সমস্ত ফাংশন এবং ভেরিয়েবলকে স্থির হিসাবে সংজ্ঞায়িত করুন । এই মডিউলটির বাইরে এখন কেবলমাত্র প্রধান ফাংশন দৃশ্যমান।


যদি পুনরাবৃত্তি হয় outer-> nested-> outer-> থাকে nested, তবে সেখানে দুটি আলাদা ফ্রেম হোল্ডিং থাকবে int declared_in_outer, সুতরাং আপনি কেবল declared_in_outerএকটি স্থির গ্লোবাল হিসাবে রাখতে পারবেন না ।
অ্যাড্রিয়ান পানাসিয়ুক

1

আপনার দ্বিতীয় প্রশ্নের উত্তর দেওয়ার জন্য, এমন ভাষা রয়েছে যা নেস্টেড ফাংশনগুলি সংজ্ঞায়িত করতে দেয় (একটি তালিকা এখানে পাওয়া যাবে: নেস্টেড-ফাংশন-ভাষা-তালিকা-উইকিপিডিয়া )।

জাভাস্ক্রিপ্টে, যা সেই ভাষাগুলির মধ্যে সর্বাধিক বিখ্যাত, নেস্টেড ফাংশনগুলির মধ্যে একটি হতে পারে (যা ক্লোজার বলা হয়):

  • অবজেক্টের কনস্ট্রাক্টরে ক্লাস মেথড তৈরি করা।
  • সেটটার এবং গেটার্স সহ বেসরকারী শ্রেণির সদস্যদের কার্যকারিতা অর্জন করা।
  • বিশ্বব্যাপী নেমস্পেসকে দূষিত করার জন্য নয় (এটি অবশ্যই প্রতিটি ভাষার পক্ষে যায়)।

কিছু নাম রাখা ...


0

অথবা আপনি এটি সম্পর্কে স্মার্ট হতে পারেন এবং আপনার সুবিধার জন্য প্রিপ্রসেসর ব্যবহার করতে পারেন ( 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

-1

এটি কি সি-তে কোনও নেস্টেড ফাংশন নয়? (ফাংশন ডিসপ্লে অ্যাকাউন্টস ())

আমি জানি যে আমি ফাংশনটি আলাদাভাবে সংজ্ঞায়িত করতে পারতাম এবং ভেরিয়েবলগুলি পাস করতে পারি এবং একাধিকবার অ্যাকাউন্টগুলি মুদ্রণের জন্য আমার কী প্রয়োজন তা ভালভাবে কাজ করে না।

(স্কুল অ্যাসাইনমেন্ট থেকে নেওয়া স্নিপেট) ...

//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;
}

4
এটি আইনী মান সি নয়, যদি এটি আপনার সংকলকটির সাথে কাজ করে তবে এর কারণ আপনার সংকলকটি স্ট্যান্ডার্ড সি ভাষায় এক্সটেনশন সরবরাহ করেছে; কোনও অর্থে আপনার সংকলক একটি পৃথক ভাষা সংকলন করছে, যা সি বলে নয়, কঠোরভাবে বলছে
ন্যাট এল্ড্রেজ

আপনার সহযোগিতার জন্য ধন্যবাদ. আমি তখন থেকে কার্যকারিতা ঘোষণা, সংজ্ঞা এবং ব্যবহারের সঠিক উপায় শিখেছি। এই একটি বিট> পিছনে তাকান লজ্জাজনক <।
midnightCoder

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