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

先说说结论吧!

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

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



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值