关于头文件变量的声明和定义

先说说结论吧!

在很多论坛和问问中看到这样的问题:  在头文件是否可以定义变量?今天写了一堆文件进行了验证。

结论: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中),相当于只定义了一次,并不违反语法规则。所以得到以上结论。



发布了37 篇原创文章 · 获赞 14 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/xiaod_szu/article/details/9745217