2015-05-05 2 views
0

Я пытаюсь передать локальную переменную (в func1) функции (func2) в другой файл, но func2 требует ее как глобальной переменной. Для того, чтобы объяснить вещи лучше, вот эти два файла:C: Передача переменных между файлами

file1.c:

#include <something.h> 
extern void func2(); 
void func1(){ 
    int a=0; 
    func2(); 
} 

file2.c:

#include <something.h> 
extern int a; //this will fail 
void func2(){ 
    printf("%d\n",a); 
} 

Переменная int a не может быть объявлен как глобальный file1, так как func1 называется рекурсивным. Есть лучший способ сделать это?

+0

Почему бы просто не дать двум переменным разные имена? Вызов двух разных вещей 'a' - это просто рецепт боли. –

+0

Я пытаюсь передать вещи в func2 (который я не могу изменить), а func2 принимает только 'a' как глобальный var – zzxx53

+1

Как это заставляет вас называть вашу локальную переменную' a'? Если вы вызываете свою переменную 'b', вы можете просто сделать' a = b; 'перед вызовом функции func2. –

ответ

0

Решение Ciro могло бы работать, если я только использую func1 один раз; однако func1 называется рекурсивно, поэтому переменная a не может быть глобальной в файле1 (т. е. переменная должна находиться в стеке, а не в куче). Вот решение, в котором я закончил:

Файл1.с:

#include <something.h> 
extern void func2_new(int b); 
void func1(){ 
    int a=0; 
    func2_new(a); 
} 

file2.c:

#include <something.h> 
int a; 
void func2(){ 
    printf("%d\n",a); 
} 
void func2_new(int b){ 
    a=b; 
    func2(); 
} 

Как многие уже заметили, единственным ответом было бы реорганизовать func2 полностью. Я приветствую больше вклада в это решение.

2

В file1.c:

#include <something.h> 
#include "file1.h" 

int a; 

void func1(){ 
    a = 0; 
} 

В file1.h

extern int a; 

В file2.c:

#include <something.h> 
#include "file1.h" 

void func2(){ 
    printf("%d\n",a); 
} 

Итак:

  • переменная является в файле file1.c
  • file1.h позволяет другим знать, что он существует, а его тип - int.
  • file2.c содержит file1.h, так что компилятор знает о var существование до того, как файл file2.c попытается его использовать.
1

К сожалению, я не могу прокомментировать ответ Чиро PEDRINI, так что я бы сказал: делать, как он говорит, но также:

  • Составьте список аргументов в func1 в явном виде (void) (и установить компилятор жалуются на пустые списки аргументов), потому что () просто означает, что вы не указываете, что такое аргументы, по крайней мере, на C, на которые указан ваш вопрос.
  • Объявление void func1(void);, а также a в file1.h.
  • #include file1.h в файле1.c, поэтому компилятор проверяет, что определения (в файле1.c) a и func1 соответствуют их объявлениям (в файле1.h).

Но, хотя вам, возможно, придется делать это как упражнение, старайтесь избегать передачи информации в глобальных переменных: аргументы обычно более надежны, так как легче гарантировать, что никакая другая часть программы не изменит их. И вы говорите о передаче информации в функцию recursive через глобальную переменную: в этом случае вы должны быть особенно осторожны, чтобы поднять и сохранить значение в func1 до того, как рекурсивный вызов изменяет значение - передача аргумента намного проще и более надежный!

+0

Пропущено это, исправление. Спасибо, что заметили :) –

+0

Просто добавил комментарии о рекурсии и собираюсь сказать «func1» в файле1.h. – PJTraill

Смежные вопросы