先说说结论吧!
在很多论坛和问问中看到这样的问题: 在头文件是否可以定义变量?今天写了一堆文件进行了验证。
结论:1.在头文件中可以定义变量,但我们一般不这样做,在C语言中,变量只能定义一次,而头文件经常被多个文件包含,
这样的结果就是,变量被多次定义。
2.在头文件中 int var; 是定义。 extern int var;是声明; C++ primer edition four ; p67
3.在.c文件中, int var; (写在所有函数外面) 是变量的定义,extern int var;才是变量的声明。
我写了几个文件进行了验证。文件结构如下(ubuntu下画图比较麻烦,我还是把Makefile文件贴出来吧。文件可下载,tar zxvf mulifile.tar.gz 就好):
target: main.o cal.o print.o var.o
gcc -o target main.o cal.o print.o var.o
main.o: main.c print.h cal.h externvar.h
gcc -c main.c
var.o: var.c
gcc -c var.c
cal.o: cal.c cal.h
gcc -c cal.c
print.o: print.c print.h
gcc -c print.c
clear:
rm -f *.o
cal.c:
#include "cal.h"
extern int a;
extern int b;
int sum()
{
return a+b;
}
cal.h:
int sum();
externvar.h:
int dd=0;//这里是变量的定义
main.c:
#include "externvar.h"
#include "cal.h"
#include "print.h"
int main()
{
extern int a;
extern int b;
printA();
printB();
printf("sum:%d\n",sum());
}
print.c:
#include "print.h"
extern int a;
extern int b;
void printA()
{
printf("a:%d\n",a);
}
void printB()
{
printf("b:%d\n",b);
}
print.h:
#include <stdio.h>
//int c;//在头文件中这样写是定义
//变量只能定义一次
void printA();
void printB();
var.c:
int a=11;
int b;
根据Makefile可以看出,print.h被两次包含,一次是在main.c,一次是在print.c,如果去掉注释 int cc=21;这是个变量的定义,再make 会报多次定义的错。在externvar.h 中有着变量dd=0;的定义,但make并没有报错,因为只包含了一次(在main.c中),相当于只定义了一次,并不违反语法规则。所以得到以上结论。