Можем ли мы иметь вложенную функцию в C? Какая польза от вложенных функций? Если они существуют в C, отличается ли их реализация от компилятора к компилятору?
Можем ли мы иметь вложенную функцию в C? Какая польза от вложенных функций? Если они существуют в C, отличается ли их реализация от компилятора к компилятору?
Ответы:
Вы не можете определить функцию внутри другой функции в стандарте C.
Вы можете объявить функцию внутри функции, но это не вложенная функция.
gcc имеет расширение языка, которое позволяет использовать вложенные функции . Они нестандартны и как таковые полностью зависят от компилятора.
Нет, их нет в C.
Они используются в таких языках, как Паскаль, по (как минимум) двум причинам:
Вложенные функции не являются частью ANSI C , однако, они являются частью Gnu C .
Нет, у вас не может быть вложенной функции C
. Самое близкое, что вы можете сделать, - это объявить функцию внутри определения другой функции. Однако определение этой функции должно появляться вне тела любой другой функции.
Например
void f(void)
{
// Declare a function called g
void g(void);
// Call g
g();
}
// Definition of g
void g(void)
{
}
g
станет видимым позже в файле, это объявление входит в область видимости для остальной части единицы перевода. Кроме того, вы можете вызывать функции в C без видимого объявления в области видимости, даже если это не рекомендуется.
Я упоминаю об этом, поскольку многие люди, пишущие на C, теперь используют для этого компиляторы C ++ (например, Visual C ++ и Keil uVision), поэтому вы можете использовать это ...
Хотя это еще не разрешено в C, если вы используете C ++, вы можете добиться того же эффекта с помощью лямбда-функций, представленных в C ++ 11:
void f()
{
auto g = [] () { /* Some functionality */ }
g();
}
Как ответили другие, стандартный C не поддерживает вложенные функции.
Вложенные функции используются в некоторых языках для включения нескольких функций и переменных в контейнер (внешняя функция), так что отдельные функции (за исключением внешней функции) и переменные не видны снаружи.
В C это можно сделать, поместив такие функции в отдельный исходный файл. Определите основную функцию как глобальную, а все остальные функции и переменные как статические . Теперь вне этого модуля видна только основная функция.
outer
-> nested
-> outer
-> nested
, тогда будет два разных кадра int declared_in_outer
, поэтому вы не можете просто поставить declared_in_outer
как статический глобальный.
Чтобы ответить на ваш второй вопрос, есть языки, которые позволяют определять вложенные функции (список можно найти здесь: nested-functions-language-list-wikipedia ).
В JavaScript, который является одним из самых известных из этих языков, могут быть вложенные функции (которые называются замыканиями):
назвать несколько...
Или вы можете быть умнее и использовать препроцессор в своих интересах ( 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
это не вложенная функция в 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;
}