头文件你不得不知的那些事儿

1:我们常常会看到诸如此类的头文件的书写方式:

#ifdef MY_HEAD_H__
#define MY_HEAD_H__
#endif

这个是为了防止文件的重复定义,预处理器回来处理这些头文件,当他第一次处理这个头文件的时候,发现MY_HEAD_H__还没有被定义,这样的话就会编译该条件下的宏的内容。若该文件被引用多次,那么预处理器就会发现MY_HEAD_H__已经被定义了,所以可以跳过该条件下的内容。特别是重名的时候,可以有效地防止"symbol already defined"的编译错误,通常,我们将头文件的大写用作同名,避免与项目中其他头文件重名。

2:有关__attribute__机制:参考http://www.cnblogs.com/astwish/p/3460618.html,到用时再查

我目前只是见过如下用法,是用来消除gcc -Wall选项中对于没有返回值的非空类型的函数的warning

#ifdef __GNUC__

/* This macro stops ‘gcc -Wall‘ complaining that "control reaches
end of non-void function" if we use the following functions to
terminate main() or some other non-void function. */

#define NORETURN __attribute__ ((__noreturn__))
#else
#define NORETURN
#endif

3:用于连接字符串,或者是将数字或字符串加上引号或者单引号

/*完成两个x和y的拼接*/
#define Conn(x,y) x##y
/*跟x加上单引号变字符,x长度不能超过四,可能是因为单字符转译时最多为4位*/
#define ToChar(x) #@x
/*给x加上双引号,变成字符串*/
#define ToString(x) #x
/*定义宏函数,换行时需要用\进行拼接*/
#define functionA(args){ //函数体 \
}

4:利用宏来进行调试(只讨论日志的使用)

预定义宏有__FILE__, __LINE__,__DATE__,__TIME__,由单词就可以知道他们所代表的字符串的含义,已亲测

------------------------------------先写到这里,以后有用法再更新---星期四, 2016年3月10日-----------------------------------

http://blog.chinaunix.net/uid-22566367-id-381995.html

http://www.cnblogs.com/gaojian/p/3167451.html

http://blog.csdn.net/zhangxinrun/article/details/5808788

http://www.cnblogs.com/flywuya/archive/2010/12/04/1896121.html

时间: 2024-08-26 06:31:48

头文件你不得不知的那些事儿的相关文章

C++ Primer 学习笔记与思考_3 ---头文件那些事儿(extern)

(一)extern在头文件里的使用方法 由于头文件包括在多个源文件里.而且变量的定义仅仅能出现一次,所以在头文件里. 仅仅能够声明不能够出现定义. 我们能够在头文件里用extern声明全局变量,这样在包括此头文件的cpp 中可直接使用 声明过的这个全局变量(例如以下面程序中的变量a). 可是有三个例外: 1.头文件里能够定义类 2.值在编译时就已经知道的const对象 3.能够定义inline函数 extern int ival; // yes extern int ival=1; //erro

C++中的头文件和源文件

一.C++编译模式通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件.其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码:而.h文件则被称作C++头文件,里面放的也是C++的源代码.C+ +语言支持“分别编译”(separate compilation).也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里..cpp文件里的东西都是相对独立的,在编 译(compile)时不需要与其他文件互通,只需要在编译成目标文件后再与其他的目标文件做一次链

c++头文件

一.C++编译模式通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件.其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码:而.h文件则被称作C++头文件,里面放的也是C++的源代码. C+ +语言支持“分别编译”(separate compilation).也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里..cpp文件里的东西都是相对独立的,在编 译(compile)时不需要与其他文件互通,只需要在编译成目标文件后再与其他的目标文件做一次

转:C语言中的头文件可以自己写吗?

转自:http://www.eefocus.com/computer00/blog/08-09/155791_9ebdc.html 一些初学C语言的人,不知道头文件(*.h文件)原来还可以自己写的. 只知道调用系统库函数时,要使用#i nclude语句将某些头文件包含进去. 其实,头文件跟.C文件一样,是可以自己写的. 头文件是一种文本文件,使用文本编辑器将代码编写好之后,以扩展名.h保存就行了.头文件中一般放一些重复使用的代码,例如函数声明,变量声明,常数定义,宏的定义等等. <>是标准库的

C/C++ 中头文件相互包含引发的问题

今天下午遇到一个头文件相互包含而导致的编译问题,花了我不少时间去调试没找到问题,最后晚上跟师兄讨论不少时间,突然有所顿悟! 问题重现 我把问题脱离于项目简单描述一下:我写了一个函数 bool func(ClassA* CA) 需要加到项目中,我就把这个函数的声明放到 head1.h 中,函数参数类型 ClassA 定义在另一个头文件 head2.h 中,因此我需要在 head1.h 中包含 head2.h:而 head2.h 中之前又包含了 head1.h,这样就构成了一种头文件相互包含的场景.

关于32位/64位版本头文件的重要

1.今天在测试产品发现一个十分异常的现象,代码从语法上分析完全正确,代码如下 2.在32位系统上编译可以通过,其中第15行出现警告:warning: initialization makes pointer from integer without a cast, 但执行时,正常结束 3.在64位linux系统编译可以通过,其中第15行出现警告:warning: initialization makes pointer from integer without a cast, 但在执行时出现 S

没有躲过的坑--头文件相互包含(Compiler error C2653: not a class or namespace name)

最近被自己坑儿了一把,改别人的代码,最后编译器这样报错的: error C2653: not a class or namespace name 简单描述一下: 有一个类A,声明和实现分别位于 a.h和a.cc中 有一个类B,声明和实现分别位于 b.h和b.cc中 类A的某个成员函数需要B类类型作为参数 类B的某个成员函数需要A类类型作为参数 a.h文件如下: #ifndef A_H_ #define A_H_ #include "b.h" class A { public: enum

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

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

.c和.h文件的区别(头文件与之实现文件的的关系~ )

 .c和.h文件的区别 一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子程序不要定义在.h中. 函数定义要放在.c中,而.h只做声明.否则多引用几次,就会发生函数重复定义的错误. 3楼: .h只做声明,编译后不产生代码   4楼: 这样做目的是为了实现软件的模块化 使软件结构清晰,而且也便于别人使用你写的程序 纯粹用 C 语言语法的角度,你当然可以在 .h