我们可以在C中使用嵌套函数吗?嵌套函数有什么用?如果它们存在于C中,它们的实现因编译器而异吗?
我们可以在C中使用嵌套函数吗?嵌套函数有什么用?如果它们存在于C中,它们的实现因编译器而异吗?
Answers:
不,它们在C中不存在。
之所以在Pascal之类的语言中使用它们,至少有两个原因:
不,您不能在中使用嵌套函数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中引入的lambda函数达到相同的效果:
void f()
{
auto g = [] () { /* Some functionality */ }
g();
}
正如其他人回答的那样,标准C不支持嵌套函数。
嵌套函数在某些语言中用于将多个函数和变量封装到一个容器(外部函数)中,以便从外部看不到单个函数(外部函数除外)和变量。
在C中,可以通过将此类函数放在单独的源文件中来完成此操作。将main函数定义为global,并将所有其他函数和变量定义为static。现在,只有主要功能在此模块外部可见。
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;
}