可以避免重定义,如在A.H 和B.H都INCLUDE C.H的话,如果没有上面的语句则会出错。
解决方案 »
- 一个关于文件查找与处理 为什么只能处理第一个找到的文件,而后面的只在列表中显示它的路径
- BYTE 类型
- 请问如何用MFC做一个对话框A,点击A的按钮关闭对话框A然后弹出对话框B?
- 问个很很很很小的问题!
- 关于动态图片的显示问题
- 请问在windows中有重启的api吗?谢谢
- 添加或删除时,出现IDispatch error #3088错误框!急等急等急等!!!
- 请问:谁知道double类型的数据如何表示成二进制?如果谁有IEEE754标准,麻烦给我一份!
- vc中链接数据库的问题
- 用VC6写的服务程序,怎样跑起来?
- 在Windows2000下,如何用程序访问并口?
- VC ODBC调用存储过程求助!
但是,我写了如下的代码:
a.h内容如下:
#include "c.h"
void a();
b.h内容如下:
#include "c.h"
void b();
c.h内容如下:
void c();
a.cpp内容如下:
#include "stdafx.h"
#include "a.h"
void a()
{
TRACE("a\n");
}
b.cpp内容如下:
#include "stdafx.h"
#include "b.h"
void b()
{
TRACE("b\n");
}
c.cpp内容如下:
#include "stdafx.h"
#include "c.h"
void c()
{
TRACE("c\n");
}以上内容在APPWIZARD所建立的缺省单文档程序中顺利通过编译(VC++6.0),请解释为什么?谢谢!
#include "stdafx.h"
void c();
void a();
void a()
{
TRACE("a\n");
}
//b.cpp
#include "stdafx.h"
void c();
void b();
void b()
{
TRACE("b\n");
}//c.cpp
#include "stdafx.h"
void c();
void c()
{
TRACE("c\n");
}翻译之后就是这样的,我没有看出有什么重复定义来???我个人认为
#ifndef XXXXXXXX_h_
#define XXXXXXXX_h_
唯一的好处就是尽量的加快编译速度
比如c.h如果是这样:
1. ---------------------------------------
void c();
void c();
没有问题2. --------------------------------
int cc;
void c();
没有问题(但若:
a.h
#include "c.h"b.h
#include "c.h"
#include "a.h"b.cpp编译的时候就会同时include两遍c.h,这是会报编译错误,因为有相同名字的两个全局变量int i, 这里是编译错误在上面假设的这种情况下,改变c.h为如下
#ifdef C_H
#define C_H
int i;
#endif编译错误消失了,但是会有三个连接错误,因为a.cpp,b.cpp,c.cpp各自定义了同一个叫int i的全局变量,它们不能同时存在于一个链接好的可执行程序里面(所以#ifdef能防止编译时的重定义,但是不能防止链接时的重定义)
这里我们可以看出加了#ifdef头的b.h在编译时,由于c.h会被include两次,但是c.h有#ifdef定义,所以#ifdef和#endif直接的东西只被compiler编译一次(比如语法分析比较耗时间)大家一起来讨论 (最后把分结给我,哈哈)
int cc;
void c();
虽然没有编译问题,但是链接有重复定义的问题(但若:
而 b.h 中已经有了 #include "c.h",则会产生重复包含头文件的错误:
b.h中打开了c.h,而
a.h中再次打开c.h则产生了这样的错误
如果用 c.h 中有 #define C_H
则用 #ifndef C_H 就可以判断出 c.h 是否已经被包含
如果已经被包含则不需要 #include "c.h",否则就需要