首页 > 其他 > 详细

两个问题: 1、头文件重复包含 2、头文件加了ifndef条件预处理指令为什么还会定义

时间:2014-03-06 01:10:18      阅读:686      评论:0      收藏:0      [点我收藏+]

第一个问题:编译时重定义

文件1.h

void fun1();
struct A
{
    int a;
    char b;
};

 

文件2.h

bubuko.com,布布扣
#include"1.h"
struct B
{
    struct A;
    int a;
};
void fun2();
bubuko.com,布布扣

文件1.cpp

#include"1.h"
#include"stdio.h"
void fun1()
{
    printf("fun1 is called\n");
}

 

文件2.cpp

bubuko.com,布布扣
#include"2.h"
#include<stdio.h>

void fun2()
{
    printf("fun2 is called\n");
}
bubuko.com,布布扣

文件main.cpp

bubuko.com,布布扣
#include<stdio.h>
#include"1.h"
#include"2.h"
void main()
{
   fun1(); 
  fun2();
  }
bubuko.com,布布扣

运行结果:

bubuko.com,布布扣

这个很容易解释:

因为在main.cpp中,首先包含了1.h,这是编译器就会展开1.h,发现在其中定义了结构体类型A(并不是定义变量);接着包含2.h,编译器就会展开2.h,发现2.h的第一句是#include<1.h>,这是编译器又再一次展开1.h,由此造成了结构体A的重定义。这个问题是由于在main.cpp这个文件同时包含了1.h和2.h引起的,注意是同一个文件同时包含。但是在不同CPP文件中不存在该问题,如2.cpp中包含了1.h,main.cpp也包含了1.h,但是不会出现以上问题。这就证明了源文件是单独编译的。这个问题解决非常方便,只需要加条件预处理命令即可:

//1.h

#ifndef _a1_H
#define _a1_H
void fun1();
struct A
{
int a;
char b;
};
#endif

 

 

//2.h

#include"1.h"
#ifndef _2_H
#define _2_H
struct B
{
struct A;
int a;
};
void fun2();

#endif

 

//1.cpp

#include"1.h"
#include"stdio.h"

void fun1()
{
printf("fun1 is called\n");
}

 

//2.cpp

#include"2.h"
#include<stdio.h>

void fun2()
{
printf("fun2 is called\n");
}

 

//main.cpp

#include<stdio.h>
#include"1.h"
#include"2.h"
void main()
{
fun1();
fun2();
}

 

运行结果:

bubuko.com,布布扣

 

 

第二个问题:链接时重定义

假如现在1.h中加一句话 int a;其他不变,会出现什么情况

文件1.h 

#ifndef _a1_H
#define _a1_H
void fun1();
int a;//加一句话
struct A
{
int a;
char b;
};
#endif

运行结果:

bubuko.com,布布扣

这里也出现了重定义,但是这里是链接时的重定义。分析:这里在编译时由于加了条件预处理命令,所以在编译不会报错,但是由1.cpp,2.cpp,main。cpp生成的三个1.obj,2.obj,main.obj,中都定义了a 变量,造成链接时出错。

两个问题: 1、头文件重复包含 2、头文件加了ifndef条件预处理指令为什么还会定义,布布扣,bubuko.com

两个问题: 1、头文件重复包含 2、头文件加了ifndef条件预处理指令为什么还会定义

原文:http://www.cnblogs.com/yexuannan/p/3583499.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!