Подтвердить что ты не робот

Вложенная функция в C

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Нет, они не существуют в C.

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

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

Ответ 4

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

например.

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

    // Call g
    g();
}

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

Ответ 5

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

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

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

    g();
}

Ответ 6

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

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

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

Ответ 7

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

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

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

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

Ответ 8

Или вы можете быть умны в этом и использовать препроцессор в ваших интересах (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

Ответ 9

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

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

(snipet, взятый из школьного задания)...

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