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

1.什么叫重复定义

我们在写大型项目的时候,文件多,关系复杂。往往会引起头文件重复定义的问题。

什么叫头文件重复定义呢?

举个最简单的例子:

有一个头文件"c.h",在"a.h"中存在两次对"c.h"头文件的引用。在"a.h"中有如下语句:

<span style="font-size:18px;">#include "c.h"
#include "c.h"</span>

出现这样的幼稚的错误可能有两种原因,第一种就是你不小心手一抖将"ch.h"少些了。或者是你只是好奇,写了两个。第二种是最不容易察觉到的,就是在调用其他头文件中重复调用了"c.h"。工程中调用错综复杂,不小心调用了两次是很容易发生的。

如"b.h"的头文件中有:

#include "c.h"

"a.h"同时引用了"c.h"和"b.h"即:

#include "b.h"
#include "c.h"

2.如何解决重复定义

解决重复第一个的一个好办法是每一个头文件前都加入#ifndef #define...#endif的宏定义。如头文件"c.h"写成如下形式。

#ifndef C_H
#define C_H
/*
c.h中所有内容,!注意这里是所有内容
*/
#endif</span>

3. 为什么能解决重复定义的问题?

为什么这样做能解决重复引用的问题呢?

比如上面举的第二种情况的例子,“a.h”首先引用"b.h","b.h"中调用”c.h“。第一次没有定义C_H的宏,引用"c.h"成功。第二次引用"c.h"时,由于已经定义了C_H,将不再会引用"c.h"。这样就很好的解决了重复引用的问题。

!注意1 有养成习惯每一个头文件都加这样一个宏定义。

!注意2 宏定义#define C_H下面的内容是原来的"c.h"中所有的内容。

时间: 2024-10-29 05:07:59

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

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

1.避免头文件重复包含 // test.h 此段宏的意思是如果定义了宏变量TEST_H_则不再定义它 #ifndef TEST_H_ #define TEST_H_ //头文件内容 #endif 或者 // test.h 告诉预编译器只包含一次 #pragma once 2.避免重复定义 不要将函数定义放置在头文件里面,正确的做法是头文件放置函数声明,源文件放置函数定义.因为源文件是分别编译的,假如头文件放置了函数定义,包含该头文件的每一个源文件都会定义相应的函数,从而导致重复定义.但是几种情况

C语言头文件中定义全局变量导致重复定义错误

合作方升级SDK后,程序编译出现变量重复定义的错误,通过错误提示无法找到什么位置重复定义了,但确定是引入新SDK后才出现的错误,从SDK的头文件中查找,最终发现在头文件中定义了全局变量 我们的项目在多个头文件中include了SDK的头文件,所以相当于这个全局变量在多个头文件中定义了,因此报错. 总结:头文件不要有任何全局变量的定义出现

头文件重复引用

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

关于在头文件中定义变量的问题

如果在一个头文件中定义了一个变量 A.h: int i; 在A.cpp,B.cpp...文件中包含了这个头文件,编译时就会产生重复定义的错误.问题所在是因为int i;这句代码是定义了一个i变量,包含一次头文件就定义了一次i,包含多次肯定引起错误.如果改成extern int i;这句代码就变成了一个声明了.并不会定义i这个变量.不过在多个cpp文件里初始化一样会出现错误.只能在一个cpp文件中进行初始化.

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

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

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

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

c语言头文件中定义全局变量的问题

问题是这么开始的: 最近在看一个PHP的扩展源码,编译的时候的遇到一个问题: ld: 1 duplicate symbol for architecture x86_64 仔细看了一下源码,发现在头文件中 出现了全局变量的定义. 简化一下后,可以这么理解: // t1.h #ifndef T1_H #define T1_H int a = 0; #endif //------------------ //t1.c #include "t1.h" #include "t2.h&

解决头文件中定义全局变量MSVC、GNU编译器出现重定义问题

有时候我们经常碰到这样的事情,想定义某个类的静态成员,在头文件中定义该成员或者全局变量,头文件又同时被多个文件引用到,链接的时候则会出现,重定义,但是又不想在cpp文件中定义,现有一种方法可以解决此问题,直接上代码 #if defined(_MSC_VER ) __declspec(selectany) #elif defined(__GNUC__) __attribute__((weak)) #else #error "unknown complier" #endif int a=1

能不能在头文件中定义全局变量?(转)

地址:https://blog.csdn.net/baidu_35679960/article/details/79200865 1.ANSI C标准是什么?GNU又是什么?ld是什么? ANSI C是C语言的标准规范,是国际标准化组织制定的国际标准. 虽然 ANSI C规范了C语言的实现,但是在实际情况中,各家C语言提供商都会根据平台的不同情况对ANSI C进行一定的扩展.因此可以将现实中C语言实现看作是ANSI C的一个超集.比较有代表性的例子是linux的gcc编译器.由于该编译器对ANS