c语言头文件重复包含
‘壹’ c语言,在一个头文件定义一个枚举变量,有两个C文件用#include包含了这个头文件,编译错误:重复声明成员
头文件里加防止重复定义的宏定义
#ifndef XXX_H
#define XXX_H
你的枚举;
其他定义和声明;
#endif
‘贰’ VC如何解决重复包含头文件的问题
语法上对头文件里的内容没有任何限制
c++语法有个要求就是任何名字(类型、变量或者函数什么的)都要“先声明后使用”,注意这个要求的范围是在同一个文件里,就是说你这个.cpp里用到的东西必须在你这个.cpp里先有声明。 如果你要用string类的变量, 你就必须先写清楚这个类型的声明,编译器才知道怎么去编译这一段。 所以你要是不怕累的话你可以就挨个用到的地方重复写一下,但是因为这个可能很麻烦, 也可能会几个地方写的不一致, 解决办法就是采用一个头文件,每个地方都include这个头文件, 就相当于写了这个类型的声明。 include命令的作用就是把那个头文件的内容复制到这里来, 至于头文件里面到底写了什么其实是没有语法要求的,但是如上所述, 头文件既然主要是解决这个声明的问题, 所以当然你看到的头文件里主要内容还都是声明。 现在模板横行的时候由于一些技术问题造成头文件里也写了很多实现, 这个解释起来有点麻烦,你可以不搭理它
所以总结一下, C语言要求先声明后使用,所以用头文件来形成一个统一声明, 而之所以要防止重复include头文件,是因为一个cpp里一个名字是不可以被定义多次的, 所以对那些声明=定义的东西如果重复include了,编译的时候就容易出现重复定义的错误,当然对有些声明跟定义截然分开的情况来说,重复include也没问题
‘叁’ 关于自定义头文件在多个文件中引用时提示重复定义的问题(C语言)
#ifndef identifier_h
#define identifier_h
....
#endif
这套条件编译是为了防止同一个.c文件中包含多个相同.h文件的(比如有一个.c文件包含了a.h,a.h又包含了b.h,那么当你在这个.c文件中同时包含了a.h和b.h时,因为有上面的条件编译的关系而不会出错)。因为编译器在编译的时候是按照.c文件为单位编译的,每个.c文件编译成.o文件(linux系统)或者.obj(windows系统),然后再将这些.o文件链接起来,最后与运行库链接形成可执行文件(elf或exe文件)。
你在两个.c文件中包含了同一个.h文件。这根本和条件编译没什么关系。你在.h文件中定义了全局变量a, b, c。那么就表示你两个.c文件中,每个.c文件中都有这样的全局变量定义:int a, b, c;当每个.c文件单独编译当然没有问题,但是当它们链接起来的时候就出现问题了:两个.c文件中都有变量a b c,所以当然是重复定义啊。问题是出在链接的时候的。
‘肆’ C语言中防止重复包含头文件的固定格式的疑问
1、当1个C语言程序由 多个 源程序文件 组成时,由于每个 源程序文件 都有 #include <...>
#include "...h", 最终它们可能形成交叉 包含 和 重复包含 现象 而造成错误。
为了避免这种情况发生,可以 采用 定义宏 的方法 把各个头文件 包起来。
编译器 在正式编译的开始,现处理 宏 -- 也就是“预编译命令".
2、例如:用 宏(#号开始的行) 把 头文件内容 包起来:
#ifndef _HEADER_One_H_ // 意思是:宏开始行,如果还没有定义 _HEADER_One_H_ 则 进入,否则退出
#define _HEADER_One_H_ //定义 _HEADER_One_H_//
header1.h
头文件内容
#endif // 宏结束行
‘伍’ C语言头文件避免重复包含,pragma once和#ifndef的区别
1) #pragma once用来防止某个头文件被多次include,
#pragma once是编译相关,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性差,不过现在基本上已经是每个编译器都有这个定义了。
2) #ifndef,#define,#endif用来防止某个宏被多次定义。
#ifndef,#define,#endif这个是C++语言相关,这是C++语言中的宏定义,通过宏定义避免文件多次编译。
‘陆’ c语言头文件和c++头文件有没有相同或重复的
c里面的c++基本全支持,c++多出来的c用不了
‘柒’ 这个问题,C语言,一个关于头文件重复定义的问题!!!
1、
int
c;
这个算是定义,不是声明,在编译期间不会有问题,链接的时候会重定义,应该在头文件中
extern
int
c;在.c文件中int
c;
这样就不会出现重定义的问题了,你好好研究下定义跟声明,编译跟链接。
2、中间能包含一些特殊的定义,类定义,和inline函数定义等等,int
c;
这个算是定义,不是声明,extern
int
c;这个算是声明。。。
‘捌’ (C语言)定义宏 以防止重复包含此头文件 这句话是什么意思
当1个C语言程序由 多个 源程序文件 组成时,由于每个 源程序文件 都有 #include <...>
#include "...h", 最终它们可能形成交叉 包含 和 重复包含 现象 而造成错误。
为了避免这种情况发生,可以 采用 定义宏 的方法 把各个头文件 包起来。
编译器 在正式编译的开始,现处理 宏 -- 也就是“预编译命令".
用 宏(#号开始的行) 把 头文件内容 包起来:
#ifndef _HEADER_One_H_ // 意思是:宏开始行,如果还没有定义 _HEADER_One_H_ 则 进入,否则退出
#define _HEADER_One_H_ //定义 _HEADER_One_H_//
header1.h
头文件内容
#endif // 宏结束行
‘玖’ C语言 头文件重复包含问题 inndef 怎么用
#ifndef BASE_H//如果没有定义过 BASE_H ,就编译下面的代码
#define BASE_H//定义这个宏
#endif
在每一个.h文件,都使用这个编译指令。即使多次 #include,也不会重复包含。
#ifndef BASE_H
如果首次 #include 这个.h文件,BASE_H 没有被定义,所以这个.h文件就包含进来参与编译,同时定义了BASE_H
后续再次 #include 这个 .h 文件,由于 BASE_H已经定义过,所以在对应的 #endif 前的代码不参与编译,就不会出现两个基本信息结构体
----------------------
除了头文件的包含,ifdef 也会用在其他地方,比如判断编译环境,
#ifndef _WIN64
#define NULL 0
#else
#define NULL 0LL
#endif