为了避免同一个头文件被多重包含/重复包含,有两种方式: 方式一: #ifndef XXX #define XXX ... ...  //声明语句 #endif  //XXX 方式二: #pragma once ... ...//声明语句 在能够支持这两种方式的编译器上面,两者没有太大区别,但任存在一些细微差别. 方式一---依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含. 缺点:缺点就是如果不同头文件的宏名不小心“撞车”,可能就会…
C/C++避免头文件重复包含的方法 1. #ifndef 2. #pragma once 3. 混合使用 在实际的编程过程中,因为会使用多个文件,所以在文件中不可避免的要引入一些头文件,这样就可能会出现一个头文件被 include 多次,在C/C++中有几种不同的方式可以解决这个问题,总体功能相差不大,但依然存在细微差别. 1. #ifndef 格式如下: #ifndef __COMPLEX__ #define __COMPLEX__ //头文件主体 #endif 或者 #ifndef __CO…
当一个项目比较大时,往往都是分文件,这时候有可能不小心把同一个头文件 include 多次,或者头文件嵌套包含. 方法一: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ // 声明语句 #endif 方法二: #pragma once // 声明语句…
为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef方式,一种是#pragma once方式.在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别. 不同的地方 // 方式一: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ ... ... // 声明.定义语句 #endif //方式二: #pragma once ... ... // 声明.定义语句 #ifndef的方式受C/C++语…
c++ 头文件包含 原因的分析:   c++  头文件的循环引用是指: .h 里面的里面的头文件的相互包含的,引起的重复引用的问题.cpp 里面包含头文件是不存在重复引用的问题(因为CPP没有#ifndef #define #endif 这个). 关键的原因是:#ifndef #define #endif 引起的.  翻译一下就是  如果没有定义 包含, 如果定义了 就不包含了. 由于 宏是全局唯一的,所以只会包含一次.这就是引起重复包含的原因.这些问题的解决办法:http://my.oschi…
第一个问题:编译时重定义 文件1.h void fun1(); struct A { int a char b; };   文件2.h #include"1.h" struct B { struct A; int a; }; void fun2();   文件1.cpp #include"1.h" #include"stdio.h" void fun1() { printf("fun1 is called\n"); } 文件2…
一.类嵌套的疑问 C++头文件重复包含实在是一个令人头痛的问题,前一段时间在做一个简单的数据结构演示程序的时候,不只一次的遇到这种问题.假设我们有两个类A和B,分别定义在各自的有文件A.h和B.h中,但是在A中要用到B,B中也要用到A,但是这样的写法当然是错误的: class B; class A { public: B b; }; class B { public: A a; }; 因为在A对象中要开辟一块属于B的空间,而B中又有A的空间,是一个逻辑错误,无法实现的.在这里我们只需要把其中的一…
今天再看二叉树的知识,看着看着就看到C/C++的头文件及头文件重复定义这一块去了.以前就看到过这个问题,但是自己一直没有用到这方面的东西,今天遇到就顺便总结一下,等以后忘了再回来看看. 首先明确一点C/C++头文件是要来干什么的?(http://baike.baidu.com/link?url=lMbCZqCAsBJ_rhifA82koGGjoJmbZUy1tTPNPzertEc7nxNr71Xqfm63GEuqA8Ze) 头文件的作用有三: 1.C\C++采用源文件单独编译为object文件,…
一.<Google C++ 编程风格指南>里的观点 公司在推行编码规范,领导提议基本上使用<Google C++ 编程风格指南>.其中<Google C++ 编程风格指南>对于头文件的包含顺序是这样的: Names and Order of Includes link ▽Use standard order for readability and to avoid hidden dependencies:C library, C++ library, other lib…
转自:http://blog.csdn.net/hazir/article/details/38600419 今天下午遇到一个头文件相互包含而导致的编译问题,花了我不少时间去调试没找到问题,最后晚上跟师兄讨论不少时间,突然有所顿悟! 问题重现 我把问题脱离于项目简单描述一下:我写了一个函数 bool func(ClassA* CA) 需要加到项目中,我就把这个函数的声明放到 head1.h 中,函数参数类型 ClassA 定义在另一个头文件 head2.h 中,因此我需要在 head1.h 中包…
C++中#include包含头文件带 .h 和不带 .h 的区别? 如 #include <iostream> 和 #include <iostream.h> 包含的东西有哪些不同? 之前在写C++程序的时候只知道使用 #include <iostream> 的时候,使用函数前要用 using namespace std; 导入命名空间,而 #include <iostream.h> 则不用,这个得看C+ +标准化过程为C++开发者做了哪些有意义的工作. (…
C++头文件记得加#pragma once不然可能会导致重定义类…
引用自:https://blog.csdn.net/xhfight/article/details/51550446 为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef方式,一种是#pragma once方式.在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别. (一) #ifndef的方式受C/C++语言标准支持 优点: (1) 不光可以保证同一个文件不被包含多次,也能保证内容完全相同的两个文件(或者代码片段)不被同时包含.…
引子----之前写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 "":    一般用于包含用户自己编写的头文件,编译器会先在项目的当前目录查找,找不到后才会去系统配置的库环境变量和用户配置的路径去搜索 尖括号和双引号,区别不是很重要的.其实编译器搜索包含文件,是依据搜索路径环境设置,那是很灵活的.一般说推荐用尖括号,不过是减少搜索路径加快预处理速度的意思,…
catkin_make编译时,往往需要自动链接同一个工作空间的其他包的头文件.否则会出现类似如下的错误: /home/xx/xx_ws/srcA_package/src/db.hpp:13:26: fatal error: B_package/alax.h: No such file or directory #include <B_package/alax.h> ^ 这需要对包进行配置,假设包A_package需要引用B_package的头文件(例如由message,srv,action自动…
这两天被问到一个很有意思的问题:C头文件中尖括号与双引号有什么区别,以前只大约知道 <> 常用在系统库文件,"" 常用在自定义的借口文件中,那具体在gcc编译搜索过程中有啥区别,还得仔细查阅一番相关文档. 针对 <>  与 "" 的区别有如下解释: 摘抄自:https://gcc.gnu.org/onlinedocs/cpp/Include-Syntax.html#Include-Syntax 而在搜索时的区别,则做如下优先级排序: 摘抄自:…
  为了避免同一个文件被include多次 1   #ifndef方式2   #pragma once方式 在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别.    方式一:     #ifndef __SOMEFILE_H__    #define __SOMEFILE_H__    ... ... // 一些声明语句    #endif     方式二:     #pragma once    ... ... // 一些声明语句     #ifndef的…
为了避免同一个文件被include多次,我们可以通过以下两种方式来进行宏定义: 1. #ifndef方式2. #pragma once方式 在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别. 方式一: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ ... ... // 一些声明语句 #endif   方式二: #pragma once ... ... // 一些声明语句 #ifndef 的方式依赖于宏名字不能冲突…
#pragma once 与 #ifndef 的作用 (1)在C/C++中,在使用预编译指令#include的时候,为了防止重复引用造成二义性. (2)在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别. #pragma once 与 #ifndef 的用法 #pragma once #pragma once #ifndef #ifndef _CODE_BLOCK #define _CODE_BLOCK // code ... #endif // _CODE_…
// 如果zzz没有定义就定义zzz,然后执行下面的代码,定义了就不执行 #if !defined(zzz) #define zzz struct PPoint { int x; int y; }; #endif…
当出现访问类的函数或者需要确定类大小的时候,才需要用头文件(使用其类定义)    http://blog.csdn.net/clever101/article/details/4751717 看到这个警告,我想你一定悟到了什么.下面我说说我的结论:类的前置声明和包含头文件的区别在于类的前置声明是告诉编译器有这种类型,但是它没有告诉编译器这种类型的大小.成员函数和数据成员,而包含头文件则是完全告诉了编译器这种类型到底是怎样的(包括大小和成员).这下我们也明白了为何前置声明只能使用指针来进行,因为指…
想必很多人都看过“头文件中用到的 #ifndef/#define/#endif 来防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?头文件被重复引用了,会产生什么后果?是不是所有的头文件中都要加入#ifndef/#define/#endif 这些代码? 1. 其实“被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的.如:存在a.h文件#include "c.h"而此时b.cpp文件导入了#include &q…
想必很多人都看过“头文件中的 #ifndef/#define/#endif 防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?是不能在不同的两个文件中使用include来包含这个头文件吗?如果头文件被重复引用了,会产生什么后果?是不是所有的头文件中都要加入#ifndef/#define/#endif 这些代码?   其实“被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的.比如:存在a.h文件#include "c.h…
转自:http://www.cnblogs.com/clover-toeic/p/3728026.html 说明 本文假定读者已具备基本的C编译知识. 如非特殊说明,文中“源文件”指*.c文件,“头文件”指*.h文件,“引用”指包含头文件. 一.头文件作用 C语言里,每个源文件是一个模块,头文件为使用该模块的用户提供接口.接口指一个功能模块暴露给其他模块用以访问具体功能的方法.使用源文件实现模块的功能,使用头文件暴露单元的接口.用户只需包含相应的头文件就可使用该头文件中暴露的接口. 通过头文件包…
C++遵循先定义,后使用的原则.就拿函数的使用来举例吧. 我看过有些人喜欢这样写函数. #include<iostream> using namespace std; int add(int x, int y) //A { return x + y; } int main() { , ); //B system("pause"); ; } 但我更偏向下面这种. #include<iostream> using namespace std; int add(int…
一.重复包含头文件 头文件重复包含,可能会导致的错误包括:变量重定义,类型重定义及其他一些莫名其妙的错误.C++提供两种解决方案,分别是#ifndef和#pragma once #ifndef _SOME_FILE_H_ #pragma once #define _SOME_FILE_H_ ...//一些声明语句 ...//一些声明语句 #endif 第一种方式:通过这种预处理实现唯一检查.预处理首先测试_SOME_FILE_H_变量是否未定义,如果_SOME_FILE_H_未定义,那么#ifn…
想必很多人都看过“头文件中的 #ifndef #define #endif 防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?是不能在不同的两个文件中使用include来包含这个头文件吗?如果头文件被重复引用了,会产生什么后果?是不是所有的头文件中都要加入#ifndef/#define/#endif 这些代码? 其实“被重复引用”是指一个头文件在同一个c文件中被include了多次,这种错误常常是由于include嵌套造成的.比如:对于a.h,b.h中有#include a.h,…
想必很多人都看过“头文件中用到的 #ifndef/#define/#endif 来防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?头文件被重复引用了,会产生什么后果?是不是所有的头文件中都要加入#ifndef/#define/#endif 这些代码? 1. 其实“被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的.如:存在a.h文件#include "c.h"而此时b.cpp文件导入了#include &q…
在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时,就会出现大量重定义的错误.在头文件中实用#ifndef #define #endif能避免头文件的重定义.方法:例如要编写头文件test.h在头文件开头写上两行:#ifndef _TEST_H#define _TEST_H//一般是文件名的大写头文件结尾写上一行:#endif这样一个工程文件里同时包含两个test.h时,就不会出现重定义的错误了.分析:当第一次包含test.h时,由于没有定义_TES…