2014-12-04 3 views
1

Привет StackOverflow волшебники:Используя внешние переменные в нескольких файлах C

У меня есть следующие три простых файлов C:

// File 1 
#include "mainPgm.h" 
void file1() { 
    printf("N1 is now %d.\n", n1);      
} 

// File 2 
#include "mainPgm.h" 
void file2() { 
    printf("N2 is now %d.\n", n2);      
} 

// File 3 
#include "mainPgm.h" 
void file3() { 
    printf("N3 is now %d.\n", n3);      
} 

И, конечно, главная программа:

#include <stdio.h> 
#include <stdlib.h> 
#include "mainPgm.h" 

int main() { 
    int n1 = 65536, 
     n2 = 256, 
     n3 = 16; 

    file1(); 
    file2(); 
    file3(); 
} 

Наконец , заголовочный файл:

#include<stdio.h> 
void file1(), file2(), file3(); 
extern int n1, n2, n3; 

Все они скомпилированы с помощью простого Gcc команды:

gcc -std=gnu99 -O2 -o jj -Wunused file1.c file2.c file3.c mainPgm.c 

Это приводит к следующим ошибкам:

mainPgm.c: In function ‘main’: 
mainPgm.c:8:7: warning: unused variable ‘n3’ [-Wunused-variable] 
mainPgm.c:7:7: warning: unused variable ‘n2’ [-Wunused-variable] 
mainPgm.c:6:7: warning: unused variable ‘n1’ [-Wunused-variable] 
/tmp/ccVQjFHY.o: In function `file1': 
file1.c:(.text+0x2): undefined reference to `n1' 
/tmp/ccZqyI0n.o: In function `file2': 
file2.c:(.text+0x2): undefined reference to `n2' 
/tmp/ccbpJOpN.o: In function `file3': 
file3.c:(.text+0x2): undefined reference to `n3' 
collect2: error: ld returned 1 exit status 

Я думал, что определение n1, n2, n3 и в mainPgm.h бы служат для объявления переменных, и их определение в mainPgm.c будет определять их. Нет! Где я неправ?

TIA!

+0

См. [Как использовать 'extern' для обмена переменными между исходными файлами в C?] (Http://stackoverflow.com/questions/1433204/how-do-i-use-extern-to-share-variables -between-source-files-in-c/1433387 # 1433387) –

+0

Вы можете (или не можете) отметить, что: (1) Ваша основная программа не использует код из '' или '' (так что те включая не нужны); (2) Заголовок '' mainPgm.h "' не нужно включать '', поскольку ни одно из объявлений в нем не зависит от каких-либо объявлений из '' - но если вы удалили '' из '" mainPgm.h «', вам нужно явно указывать '' в каждом из файлов 'fileN.c'. В файле 'mainPgm.c' вы фактически включили' 'дважды. Это безобидно; стандартные C-заголовки являются автономными и идемпотентными. Ваш заголовок тоже должен быть. –

+0

Я удалил объявления stdio и stdlib из mainPgm.c и не имел проблем с компиляцией. – Boffin

ответ

3

Все ваши переменные являются локальной переменной внутри main(), они никогда не будут видны снаружи этой функции.

Переместите их так, что они глобальные:

int n1 = 65536, 
     n2 = 256, 
     n3 = 16; 

int main() { 
    file1(); 
    file2(); 
    file3(); 

    return EXIT_SUCCESS; 
} 
+0

В этом была проблема, программа теперь работает. Благодаря! – Boffin

2

Вы определили переменные в основной функции(), в стек.

Вы можете определить их в том же файле, но вне вашей основной функции.

В качестве альтернативы, общая идиома используется для использования препроцессора для объявления переменных как extern во всех, кроме одного экземпляра вашего файла заголовка.

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

  • Нет связанных вопросов^_^