Podemos ter uma função aninhada em C? Qual é o uso de funções aninhadas? Se eles existem em C, sua implementação difere de compilador para compilador?
Podemos ter uma função aninhada em C? Qual é o uso de funções aninhadas? Se eles existem em C, sua implementação difere de compilador para compilador?
Respostas:
Você não pode definir uma função dentro de outra função no padrão C.
Você pode declarar uma função dentro de uma função, mas não é uma função aninhada.
gcc tem uma extensão de linguagem que permite funções aninhadas . Eles não são padronizados e, como tais, são totalmente dependentes do compilador.
Não, eles não existem em C.
Eles são usados em linguagens como Pascal por (pelo menos) dois motivos:
Aninhados funções não são uma parte de ANSI C , no entanto, eles fazem parte de GNU C .
Não, você não pode ter uma função aninhada em C
. O mais próximo que você pode chegar é declarar uma função dentro da definição de outra função. A definição dessa função deve aparecer fora de qualquer outro corpo de função, no entanto.
Por exemplo
void f(void)
{
// Declare a function called g
void g(void);
// Call g
g();
}
// Definition of g
void g(void)
{
}
g
esteja visível posteriormente no arquivo, essa declaração estará no escopo para o resto da unidade de tradução. Além disso, você pode chamar funções em C sem uma declaração visível no escopo, mesmo que não seja aconselhável.
Menciono isso porque muitas pessoas que codificam em C agora estão usando compiladores C ++ (como Visual C ++ e Keil uVision) para fazer isso, então você pode fazer uso disso ...
Embora ainda não seja permitido em C, se você estiver usando C ++, poderá obter o mesmo efeito com as funções lambda introduzidas em C ++ 11:
void f()
{
auto g = [] () { /* Some functionality */ }
g();
}
Como outros responderam, C padrão não suporta funções aninhadas.
Funções aninhadas são usadas em algumas linguagens para incluir várias funções e variáveis em um contêiner (a função externa) para que as funções individuais (excluindo a função externa) e as variáveis não sejam vistas de fora.
Em C , isso pode ser feito colocando essas funções em um arquivo de origem separado. Defina a função principal como global e todas as outras funções e variáveis como estáticas . Agora, apenas a função principal é visível fora deste módulo.
outer
-> nested
-> outer
-> nested
, então haveria dois quadros diferentes segurando int declared_in_outer
, então você não pode simplesmente colocar declared_in_outer
como um global estático.
Para responder à sua segunda pergunta, existem linguagens que permitem definir funções aninhadas (uma lista pode ser encontrada aqui: nested-functions-language-list-wikipedia ).
Em JavaScript, que é uma das mais famosas dessas linguagens, uma das funções aninhadas (que são chamadas de fechamentos) são:
para nomear alguns...
Ou você pode ser esperto e usar o pré-processador a seu favor ( 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
esta não é uma função aninhada em C? (a função displayAccounts ())
Eu sei que poderia ter definido a função de forma diferente e passado variáveis e o que não, mas de qualquer forma funciona bem, pois precisei imprimir as contas várias vezes.
(fragmento tirado de um trabalho escolar) ...
//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;
}