c语言重复定义 multiple definition of `Recusion'

yandong 发布于 2012/08/02 10:43
阅读 9K+
收藏 0

c语言重复定义。。。。

我在头文件(.h)中定义声明了一个变量

int Recusion = 0; /*0,1*/

然后在两个.cpp文件中使用
a.cpp
--------------------------
Recusion = 1;

b.cpp
--------------------------
 if(Recusion && ...)
{
}

但是编译却有这个错误,怎么回事?
multiple definition of `Recusion' 
难道是他们都包含头文件,以致于多次定义,可是我的头文件有做处理啊

#ifndef _INCLUDE_NTREG_H
#define _INCLUDE_NTREG_H 1


加载中
0
zodiac1111
zodiac1111
  1. 先有预处理程序 把include分别包含进 a.c 和 b.c文件中(h文件就没用/丢弃了)
    其实这里#ifdef根本没被使用(利用)/没有重复包含嘛 :)
  2. 编译器汇编器分别单独 编译+汇编 a.c b.c文件生成a.ob.o 到这里没有任何问题.(这里分两步:编译/汇编,我暂时分不出这两步,在这个问题中不是很重要)
  3. 连接器 ld 链接 a.ob.o 这里发现了重复定义的r变量.
以我现有的知识是这样的过程.参照编译原理之类的知识.
extern(?)关键字可以解决这个问题.
0
yandong
yandong
参考这个http://general.blog.51cto.com/927298/235077
把变量放到a.c中,在.h中加上extern就可以了,但是为什么把变量放到.h中,在.c中加extern为什么不行
0
cmzx3444
cmzx3444
你头文件处理理解错了
yandong
yandong
头文件里面难道不可以放全局变量?
0
Yisen
Yisen
全局变量放.c里
yandong
yandong
嗯嗯,放在.h里面,再使用预处理,使其只包含一次,也不可以啊
0
cmzx3444
cmzx3444

你确实是定义了两次

#ifndef _INCLUDE_NTREG_H
#define _INCLUDE_NTREG_H 
只能保证在一个源文件中不会重复多次引用。
你现在是在两个cpp文件中,而且这两个文件要链接成一个可执行文件,就会有两处定义。
最佳实践是头文件不能有变量的定义,可以有声明。

yandong
yandong
嗯嗯,理解了
0
Mario_Q
Mario_Q
头文件中改为 int  Recusion; 就好了。C语言中全局变量默认是extern的。没必要写这个关键字。
返回顶部
顶部