【转】多个.c .h文件时出现的重复定义错误问题


       c/c++语言中有很多地方要用到extern,但是如果没有真正的了解它的意义,会给编程带来很大的麻烦,为了使大家少走弯路,特祥细的说明一下。
      对于比较小的程序,一般只有一个c文件和一个头文件,全局变量我们通常会直接定义在c文件中,在程序之前加int i定义。如果要在头文件中定义有以下两种方法:用extern来声明:extern int i;这一句只是对变量i进行声明,在c文件的程序之前必须加上int i进行定义。extern int i=0;这一句声明和定义都做了。
    对于大一点的程序,有很多c文件和头文件,这个时候全局变量就必须在头文件中声明(不需要初始化),然后在一个c文件中定义(该初始化的要初始化)。如果在头文件中定义,则编译的时候会出现重复定义的错误。如果只有头文件中声明就会出现没有定义有警告。
   *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
       SYMBOL: K
       MODULE: 222.obj (222)
出现上述错误则是因为变量k重复定义,把你的头文件中的变量定义前加extern(只是变量声明不用初始化),再在某一个你要调用该变量的c文件的程序之前再定义(注意第一个调用的c文件要负责附带初始化该变量,其他调用的c文件就不需要初始化过程啦)

 

http://zhidao.baidu.com/question/240314673.html?qbl=relate_question_0&word=%2A%2A%2A%20ERROR%20L104:%20MULTIPLE%20PUBLIC%20DEFINITIONS

 

 

变量的定义都在各自的.c文件中定义,如 int mul_variable;

然后在该.c文件对应的.h文件中做声明,extern int mul_variable;

当其它.c文件会用到这个变量 ( mul_variable ),只需include上面的.h文件即可。

例: ex1.c中定义 int mul_variable;

        ex1.h中声明 extern int mul_variable;

        当ex2.c中需要使用 mul_variable时,只需要在ex2.c中 #include "ex1.h"

 

常量、sfr、sbit的定义都放在.h文件中

如, #define CONST 5

        sfr  P0 = 0x80;

        sbit  SCL = P0^1;

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
reg52.h是Keil C51编译器的一个头文件,用于定义与8051单片机寄存器相关的常量、宏和函数等,其内容如下: ```c /* 8051 SFR declarations */ __sfr __at (0x80) P0; __sfr __at (0x81) SP; __sfr __at (0x82) DPL; __sfr __at (0x83) DPH; __sfr __at (0x87) PCON; __sfr __at (0x88) TCON; __sfr __at (0x89) TMOD; __sfr __at (0x8A) TL0; __sfr __at (0x8B) TL1; __sfr __at (0x8C) TH0; __sfr __at (0x8D) TH1; __sfr __at (0x90) P1; __sfr __at (0x98) SCON; __sfr __at (0x99) SBUF; __sfr __at (0xA0) P2; __sfr __at (0xA8) IE; __sfr __at (0xB0) P3; __sfr __at (0xB8) IP; __sfr __at (0xD0) PSW; __sfr __at (0xE0) ACC; __sfr __at (0xF0) B; /* 8052 SFR declarations */ __sfr __at (0x81) SP; __sfr __at (0x82) DPL; __sfr __at (0x83) DPH; __sfr __at (0x87) PCON; __sfr __at (0x88) TCON; __sfr __at (0x89) TMOD; __sfr __at (0x8A) TL0; __sfr __at (0x8B) TL1; __sfr __at (0x8C) TH0; __sfr __at (0x8D) TH1; __sfr __at (0x90) P1; __sfr __at (0x98) SCON; __sfr __at (0x99) SBUF; __sfr __at (0xA0) P2; __sfr __at (0xA8) IE; __sfr __at (0xB0) P3; __sfr __at (0xB8) IP; __sfr __at (0xD0) PSW; __sfr __at (0xE0) ACC; __sfr __at (0xF0) B; /* 8051 Bit addressable SFR declarations */ __sbit __at (0x80+0) P0_0; __sbit __at (0x80+1) P0_1; __sbit __at (0x80+2) P0_2; __sbit __at (0x80+3) P0_3; __sbit __at (0x80+4) P0_4; __sbit __at (0x80+5) P0_5; __sbit __at (0x80+6) P0_6; __sbit __at (0x80+7) P0_7; __sbit __at (0x90+0) P1_0; __sbit __at (0x90+1) P1_1; __sbit __at (0x90+2) P1_2; __sbit __at (0x90+3) P1_3; __sbit __at (0x90+4) P1_4; __sbit __at (0x90+5) P1_5; __sbit __at (0x90+6) P1_6; __sbit __at (0x90+7) P1_7; __sbit __at (0xA0+0) P2_0; __sbit __at (0xA0+1) P2_1; __sbit __at (0xA0+2) P2_2; __sbit __at (0xA0+3) P2_3; __sbit __at (0xA0+4) P2_4; __sbit __at (0xA0+5) P2_5; __sbit __at (0xA0+6) P2_6; __sbit __at (0xA0+7) P2_7; __sbit __at (0xB0+0) P3_0; __sbit __at (0xB0+1) P3_1; __sbit __at (0xB0+2) P3_2; __sbit __at (0xB0+3) P3_3; __sbit __at (0xB0+4) P3_4; __sbit __at (0xB0+5) P3_5; __sbit __at (0xB0+6) P3_6; __sbit __at (0xB0+7) P3_7; __sbit __at (0xD0+0) CY; __sbit __at (0xD0+1) AC; __sbit __at (0xD0+2) F0; __sbit __at (0xD0+3) RS1; __sbit __at (0xD0+4) RS0; __sbit __at (0xD0+5) OV; __sbit __at (0xD0+6) F1; __sbit __at (0xD0+7) P; /* 8052 Bit addressable SFR declarations */ __sbit __at (0x80+0) P0_0; __sbit __at (0x80+1) P0_1; __sbit __at (0x80+2) P0_2; __sbit __at (0x80+3) P0_3; __sbit __at (0x80+4) P0_4; __sbit __at (0x80+5) P0_5; __sbit __at (0x80+6) P0_6; __sbit __at (0x80+7) P0_7; __sbit __at (0x90+0) P1_0; __sbit __at (0x90+1) P1_1; __sbit __at (0x90+2) P1_2; __sbit __at (0x90+3) P1_3; __sbit __at (0x90+4) P1_4; __sbit __at (0x90+5) P1_5; __sbit __at (0x90+6) P1_6; __sbit __at (0x90+7) P1_7; __sbit __at (0xA0+0) P2_0; __sbit __at (0xA0+1) P2_1; __sbit __at (0xA0+2) P2_2; __sbit __at (0xA0+3) P2_3; __sbit __at (0xA0+4) P2_4; __sbit __at (0xA0+5) P2_5; __sbit __at (0xA0+6) P2_6; __sbit __at (0xA0+7) P2_7; __sbit __at (0xB0+0) P3_0; __sbit __at (0xB0+1) P3_1; __sbit __at (0xB0+2) P3_2; __sbit __at (0xB0+3) P3_3; __sbit __at (0xB0+4) P3_4; __sbit __at (0xB0+5) P3_5; __sbit __at (0xB0+6) P3_6; __sbit __at (0xB0+7) P3_7; __sbit __at (0xD0+0) CY; __sbit __at (0xD0+1) AC; __sbit __at (0xD0+2) F0; __sbit __at (0xD0+3) RS1; __sbit __at (0xD0+4) RS0; __sbit __at (0xD0+5) OV; __sbit __at (0xD0+6) F1; __sbit __at (0xD0+7) P; ``` 其,__sfr和__sbit是Keil C51编译器特有的类型定义,用于将一个特定的地址与一个变量或位相关联。8051单片机的SFR寄存器分为两类:可寻址寄存器和不可寻址寄存器。可寻址寄存器可以通过其地址直接访问,而不可寻址寄存器必须通过一定的方式访问。__sfr和__sbit的作用就是将这些寄存器的地址与变量或位相关联,使得程序开发者可以直接访问这些寄存器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值