LINUX.ORG.RU

Язык C. Область видимости.


0

0

Здраствуйте, друзья. Помогите решить такую задачу:
Имеем 3 файла - main.c, 1.c и 2.c. В файле 1.c определена статическая переменная var1 (static int var1) и внешняя функция func1 (extern int func1()). В файле 2.c определена статическая функция func2 (static int func2()) и указатель на int (int *var2). Необходимо в файле main.c получить доступ к var1 через func1 и доступ к func2 через var2.

Никак не могу сообразить в чем грабли.

anonymous

1) в файле 1.с нестоит/нельзя обьявлять ф-ю func1 как extern

>и доступ к func2 через var2.

2)ничего не понял. обьясни доступнее что ты хочеш

cvv ★★★★★
()

% cat 1.c                                                   /home/legioner/test
static int var1 = 3;

int func1(void)
{
        return var1;
}
% cat 2.c                                                   /home/legioner/test
#include <stdio.h>

static int func2(void)
{
        printf("This is func2\n");
        return 2;
}

int *var2 = (int*)func2;

% cat main.c                                                /home/legioner/test
#include <stdio.h>

extern int func1(void);

extern int* var2;

int main(void)
{
        printf("%d\n", func1());

        int (*f2)(void);
        f2 = var2; /* не знаю, какое приведение тут делать */
        printf("%d\n", f2());
        return 0;
}
% gcc -Wall *.c                                             /home/legioner/test
main.c: In function `main':
main.c:12: warning: assignment from incompatible pointer type
% ./a.out                                                   /home/legioner/test
3
This is func2
2


Не знаю, то или нет.
Кстати, как приводить указатель на int  к указателю на функцию? ( (int*)(void))var2 не работает, gcc ругается.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

>> int *var2 = (int*)func2;

Так делать опасно, нет ни каких гарантий, что размера указателя
на int, хватит для размещения указателя на функцию.

Правильней было бы хранить указатель м void*, так как размера
этого указателя, гарантировано, хватает для размещения указателя
на функцию

aton
()
Ответ на: комментарий от aton

>Так делать опасно, нет ни каких гарантий, что размера указателя на int, хватит для размещения указателя на функцию.

хм. а на какой платформе это может проявится???

cvv ★★★★★
()
Ответ на: комментарий от Legioner

>% cat 2.c >/home/legioner/test >#include <stdio.h> > >static int func2(void) >{ > printf("This is func2\n"); > return 2; >} > >int *var2 = (int*)func2;

а зачем такое извращение????

а почему бы не обьявить var2 как указатель на ф-ю??

cvv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.