Вложенная функция в C - PullRequest
79 голосов
/ 09 апреля 2010

Можем ли мы иметь вложенную функцию в C? Какая польза от вложенных функций? Если они существуют в C, отличается ли их реализация от компилятора к компилятору?

Ответы [ 8 ]

92 голосов
/ 09 апреля 2010

Вы не можете определить функцию в другой функции в стандарте C.

Вы можете объявить функцию внутри функции, но это не вложенная функция.

gcc имеет расширение языка, которое допускает вложенные функции . Они нестандартны и, таким образом, полностью зависят от компилятора.

31 голосов
/ 09 апреля 2010

Нет, их нет в C.

Они используются в таких языках, как Паскаль (по крайней мере) по двум причинам:

  1. Они допускают функциональную декомпозицию без загрязнения пространств имен. Вы можете определить одну публично видимую функцию, которая реализует некоторую сложную логику, полагаясь на одну или несколько вложенных функций, чтобы разбить проблему на более мелкие логические части.
  2. В некоторых случаях они упрощают передачу параметров. Вложенная функция имеет доступ ко всем параметрам и некоторым или всем переменным в области видимости внешней функции, поэтому внешней функции не нужно явно передавать кучу локальных состояний во вложенную функцию.
17 голосов
/ 09 апреля 2010

Вложенные функции не являются частью ANSI C , однако они являются частью Gnu C .

15 голосов
/ 09 апреля 2010

Нет, вы не можете иметь вложенную функцию в C. Самое близкое, что вы можете прийти - это объявить функцию внутри определения другой функции. Однако определение этой функции должно появляться вне тела любой другой функции.

Е.Г.

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

    // Call g
    g();
}

// Definition of g
void g(void)
{
}
5 голосов
/ 02 мая 2014

Я упоминаю об этом, так как многие люди, кодирующие в C, теперь используют для этого компиляторы C ++ (такие как Visual C ++ и Keil uVision), так что вы можете использовать это ...

Хотя это еще не разрешено в C, если вы используете C ++, вы можете добиться того же эффекта с помощью лямбда-функций, представленных в C ++ 11:

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

    g();
}
2 голосов
/ 09 апреля 2010

Как и другие, стандарт C не поддерживает вложенные функции.

Вложенные функции используются в некоторых языках для включения нескольких функций и переменных в контейнер (внешняя функция), чтобы отдельные функции (исключая внешнюю функцию) и переменные не были видны извне.

В C это можно сделать, поместив такие функции в отдельный исходный файл. Определите основную функцию как глобальную, а все остальные функции и переменные как static . Теперь за пределами этого модуля видна только основная функция.

1 голос
/ 24 апреля 2017

Чтобы ответить на ваш второй вопрос, существуют языки, которые позволяют определять вложенные функции (список можно найти здесь: nested-functions-language-list-wikipedia ).

В JavaScript, который является одним из самых известных из этих языков, некоторые виды использования вложенных функций (которые называются замыканиями):

  • Для создания методов класса в конструкторах объектов.
  • Для достижения функциональности частных членов класса наряду с установщиками и получателями.
  • Не загрязнять глобальное пространство имен (конечно, для каждого языка).

назвать несколько ...

0 голосов
/ 01 апреля 2015

это не вложенная функция в C? (функция displayAccounts ())

Я знаю, что мог бы определить функцию по-разному и передать переменные, а что нет, но все равно работает хорошо, так как мне нужно было распечатать счета несколько раз.

(фрагмент взят из школьного задания) ...

//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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...