C/C++函数重复定义、头文件重复包含、互相包含问题


1、避免头文件重复包含

// test.h 此段宏的意思是如果定义了宏变量TEST_H_则不再定义它
#ifndef TEST_H_
#define TEST_H_
//头文件内容
#endif

或者

// test.h 告诉预编译器只包含一次
#pragma once

2、避免重复定义

不要将函数定义放置在头文件里面,正确的做法是头文件放置函数声明,源文件放置函数定义。因为源文件是分别编译的,假如头文件放置了函数定义,包含该头文件的每一个源文件都会定义相应的函数,从而导致重复定义。但是几种情况可以例外:内联函数的定义、类的定义、const和static变量,以及模板类/函数要求头文件必须包含定义才可以模板化。

3、避免头文件互相包含和循环包含

头文件互相包含会导致递归包含,头文件互相依赖的逻辑本身就是错误的而且无法实现,头文件循环包含同理(比如a.h包含b.h,b.h包含c.h,c.h包含a.h)。正确的做法是将头文件的依赖降到最小,尽量在源文件中包含头文件,头文件中尽量用前置声明(尽量使用指针和引用,相关定义放到源文件中 等)。前置声明的类是不完全类型,不完全类型只能以有限方式使用。不能定义该类型的对象。不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。

时间: 2024-10-11 18:25:05

C/C++函数重复定义、头文件重复包含、互相包含问题的相关文章

关于C/C++头文件重复定义的思考

1.什么叫重复定义 我们在写大型项目的时候,文件多,关系复杂.往往会引起头文件重复定义的问题. 什么叫头文件重复定义呢? 举个最简单的例子: 有一个头文件"c.h",在"a.h"中存在两次对"c.h"头文件的引用.在"a.h"中有如下语句: <span style="font-size:18px;">#include "c.h" #include "c.h"

cocos2d-x 扩充引擎基类功能 引起的头文件重复包含问题的分析

c++ 头文件包含 原因的分析:   c++  头文件的循环引用是指: .h 里面的里面的头文件的相互包含的,引起的重复引用的问题.cpp 里面包含头文件是不存在重复引用的问题(因为CPP没有#ifndef #define #endif 这个). 关键的原因是:#ifndef #define #endif 引起的.  翻译一下就是  如果没有定义 包含, 如果定义了 就不包含了. 由于 宏是全局唯一的,所以只会包含一次.这就是引起重复包含的原因.这些问题的解决办法:http://my.oschi

头文件重复引用

Q:.h头文件中的ifndef/define/endif 的作用? A:防止该头文件被重复引用. 说明: 有些头文件重复包含只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些. 有的会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的) . 如果头文件被循环包含,有的编译器会智能处理,和只include一次一样:有的会报错,有的直接死锁,导致编译程序崩溃(这个只有很低级的编译器才会出现在几乎看不到了). 不管怎样,用ifnde xxx #defi

C++ 头文件重复包含解决之道

我们在C/C++编程中,经常出现这种类型的错误:error: redefinition of 'struct student'或者error: previous definition of 'struct student'. 字面来看,指的是重新定义或者先前已定义.下面我将针对这一类型问题给出一套系统的解决方案,看了以下文章后,相信以后对于这种问题将会胸有成竹,对于程序的设计也更加合理. 开门见山,我讲给出一个具体的例子. 1.实例 struct.h struct student { char

将函数实现放在头文件中

研究一个开源算法库,采用C++模板编程,所有函数实现都放在了头文件中,现在把模板去掉,链接时发生冲突,具体原因如下: 因为多个源文件包含了含有函数定义的头文件,在编译的时候,每个源文件都会包含一份函数定义,在链接时编译器不知道需要连接哪一份函数定义. 解决方法有三个: 1. inline关键字 可以用关键字inline修饰函数定义,例如: inline int add(int x, int y) { return x + y; } 使用inline关键字,编译器会在调用此函数的地方把函数的目标代

【转载】防止变量重复定义、头文件重复包含、嵌套包含

[转自] http://hi.baidu.com/zengzhaonong/blog/item/8a8871062d481f7f03088106.html #include文件的一个不利之处在于一个头文件可能会被多次包含,为了说明这种错误,考虑下面的代码: #include "x.h"#include "x.h" 显然,这里文件x.h被包含了两次,没有人会故意编写这样的代码.但是下面的代码:#include "a.h"#include "

c++头文件重复引用问题

引子----之前写C++ 时遇到的坑 之前由于Java实在太好用了,C++的工程代码几乎没怎么碰,真的写起来的时候总会有些小bug,这里就对其中的一个进行个总结 a.h #include "b.h" class a{ public: a(); ~a(); } a.cpp #incldue "a.h" a::a(){ .... }; a::~a(){ .... }; b.h #include "a.h" class b{ public: b();

头文件重复包含(转)

#include文件的一个不利之处在于一个头文件可能会被多次包含,为了说明这种错误,考虑下面的代码:#include "x.h"#include "x.h" 显然,这里文件x.h被包含了两次,没有人会故意编写这样的代码.但是下面的代码:#include "a.h"#include "b.h" 看上去没什么问题.如果a.h和b.h都包含了一个头文件x.h.那么x.h在此也同样被包含了两次,只不过它的形式不是那么明显而已. 多重包

#ifndef#define#endif防止头文件重复包含

#ifndef 主要目的:防止头文件的重复包含和编译. 如果在h文件中定义了全局变量,一个c文件包含同一个h文件多次,如果不加#ifndef宏定义,会出现变量重复定义的错误:如果加了#ifndef,则不会出现这种错误. 1 #ifndef x //先测试x是否被宏定义过 2 #define x 3 程序段1 //如果x没有被宏定义过,定义x,并编译程序段 1 4 #endif 5 程序段2 //如果x已经定义过了则编译程序段2的语句,"忽视"程序段 1