[C] Ponteiros para funções noutro ficheiro

Aparicio

/dev/mod
Staff
Boas,

estou a utilizar uns ponteiros para funções noutro ficheiro mas dá erro por a função não estar definida, para resolver isto tenho de estar a definir a função no mesmo ficheiro, mas para muitas funções não dá jeito.

Num exemplo simples:
main.c
Código:
[B]int soma( int x, int y );[/B]

int main( int argc, char **argv )
    {
    int (*func)( int x, int y );
    
    func = &soma;
    
    printf( "%d\n", (*func)( 5, 6 ) );
    
    return 0;
    }
func.c
Código:
int soma( int x, int y )
    {
    return x + y;
    }
O que eu queria era que isto funcionasse sem ser preciso o int soma( int x, int y ); no main.c.

Alguma sugestão?
 
Última edição:
porque não usas headers? é para isso que eles servem.
fazes um func.h com as declarações todas, e um func.c com a definições todas e incluis o .h no main.c e pronto.
 
Mas se para aceder a uma função noutro ficheiro não é preciso porquê que para associar um ponteiro à mesma função já é preciso declara-la nesse ficheiro? É isto que não percebo...

Eu só não queria sempre que escrevo uma nova função estar a declara-la noutro lado, mas sendo assim é isso que vou ter que o fazer.
 
"Não é preciso" não é bem assim. Depende da ordem com que compilas os ficheiros. Se queres aceder a funções de outro ficheiro, fazes um ficheiro .h para cada .c, apenas com os cabeçalhos e com os devidos "includes". No ficheiro .c não te esqueças de fazer o include do respectivo .h
 
Não é? Eu tenho um projecto com vários ficheiros que acedem às funções uns dos outros sem ser preciso declarar nada.
O único header que tenho é um comum a todos os ficheiros .c onde estão as bibliotecas e as estruturas.
 
Bom, eu estou a tentar ajudar... Estou-te a dizer que a maneira CORRECTA de o fazer é através dos ficheiros .h
Mas isso depende se estás a usar um IDE como o Visual Studio, ou não (linha de comandos em Linux, por e.x.). Se estiveres em linha de comandos, a ordem com que compilas os ficheiros pode mascarar esse problema e não ser necessário... Mas não é boa programação. Diz-te alguém que já programa há alguns anos em C...

Qualquer das formas precisas sempre de headers para o queres fazer. É a solução... Aceitas se quiseres, como é óbvio.
 
Não digo que estejas a dizer algo mal, só estou a tentar perceber isto de estar dividido em vários ficheiros.

Acerca disso da ordem, mesmo que tenha dois ficheiros que acedam a funções um do outro continua a não haver problema se não declarar as funções. Não deveria não ser assim pelo que dizes? :confused:

Estou a utilizar o Dev-cpp.
 
Não conheço o Dev-cpp. No entanto se for como dizes, com "referências cruzadas" não deveria dar para compilar... Pelo menos no gcc ele não resolvia a compilação.

Agora já sabes: cada ficheiro tem um .h, que pode fazer includes de outros .h. Desta forma fica tudo organizado, e quando tiveres muitas funções em cada ficheiro não tens de andar a vasculhar pelo código a tentar perceber se a função está nesse ficheiro ou não. É para isso mesmo que servem os headers - para resolver problemas de referências cruzadas, e para estruturar melhor o código. Senão usava-se tudo no mesmo ficheiro, o que não faz sentido nenhum...
 
Estou a utilizar mais especificamente num caso em que tenho vários if, cada um vai provocar uma acção diferente mas todos repetem uma parte.

Código:
char* (*func)( setcfg*, setvar*, msg_s );
func = NULL;

if( ... ) func = &funcão1;
else if( ... ) func = &funcão2;
else if( ... ) func = &funcão3;
...

if( func != NULL )
       {
       char *resp = (char*)(*func)( cfg, var, msg );
       ptrcl_msg( cfg, var, resp );
       free( resp );
       }
Acho que são úteis aqui visto não ter que repetir esta última parte para cada if.

Para isto funcionar é que terei de usar os headers para definir as funções de cada ficheiro.

Realmente vê-se no código de aplicações open-source que utilizam headers para cada ficheiro, eu é que como nunca precisei nunca os utilizei com esse propósito.
 
Back
Topo