Cで入れ子関数を使用できますか?ネストされた関数の使用は何ですか?Cに存在する場合、それらの実装はコンパイラごとに異なりますか?
Cで入れ子関数を使用できますか?ネストされた関数の使用は何ですか?Cに存在する場合、それらの実装はコンパイラごとに異なりますか?
回答:
標準Cの別の関数内で関数を定義することはできません。
関数内で関数を宣言できますが、これはネストされた関数ではありません。
gccには、ネストされた関数を許可する言語拡張があります。それらは非標準であり、完全にコンパイラに依存しています。
ネストされた関数は、の一部ではない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は、これは、別のソースファイルにこのような機能を置くことによって行うことができます。main関数をグローバルとして定義し、他のすべての関数と変数をstaticとして定義します。これで、メインモジュールのみがこのモジュールの外に表示されます。
outer
-> nested
-> outer
-> nested
がある場合は、2つの異なるフレームが保持されるint declared_in_outer
ためdeclared_in_outer
、静的グローバルとして配置することはできません。
2番目の質問に答えるために、ネストされた関数を定義できる言語があります(リストは、nested-functions-language-list-wikipediaにあります)。
これらの言語の中で最も有名なものの1つであるJavaScriptでは、ネストされた関数(クロージャーと呼ばれる)の1つは次のとおりです。
いくつか例を挙げると...
または、それについて賢く、プリプロセッサを有利に使用することができます(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;
}