Привет 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!
См. [Как использовать 'extern' для обмена переменными между исходными файлами в C?] (Http://stackoverflow.com/questions/1433204/how-do-i-use-extern-to-share-variables -between-source-files-in-c/1433387 # 1433387) –
Вы можете (или не можете) отметить, что: (1) Ваша основная программа не использует код из '' или '' (так что те включая не нужны); (2) Заголовок '' mainPgm.h "' не нужно включать '', поскольку ни одно из объявлений в нем не зависит от каких-либо объявлений из '' - но если вы удалили '' из '" mainPgm.h «', вам нужно явно указывать '' в каждом из файлов 'fileN.c'. В файле 'mainPgm.c' вы фактически включили' 'дважды. Это безобидно; стандартные C-заголовки являются автономными и идемпотентными. Ваш заголовок тоже должен быть. –
Я удалил объявления stdio и stdlib из mainPgm.c и не имел проблем с компиляцией. – Boffin