服装行业网站建设及推广,广州公司注册网上核名,湖南搜索引擎推广软件,自己开发购物网站宏定义
首先在谈论正式话题之前#xff0c;需要先介绍一个基础概念#xff0c;也是前提#xff0c;那就是宏定义。
#define demo 1
#define PI 3.14我们都知道这样会将demo 在预处理阶段替换或者说展开为1#xff0c;Pi 替换为3.14。 #define 宏定义一个标识符来表示一个…宏定义
首先在谈论正式话题之前需要先介绍一个基础概念也是前提那就是宏定义。
#define demo 1
#define PI 3.14我们都知道这样会将demo 在预处理阶段替换或者说展开为1Pi 替换为3.14。 #define 宏定义一个标识符来表示一个常量。预处理所执行的操作就是简单的“文本”替换。
#include stdio.h也是这样的即在预处理的时候先单纯地用头文件stdio.h中所有的“文本”内容替换程序中#include stdio.h这一行然后再进行正式编译。
参考这个链接 http://c.biancheng.net/view/187.html 条件编译
好了知道这个概念以后我们就可以引入接下来这个概念条件编译。
#if defined() || defined() || ...
#ifdef
#ifndef
#else if
#else
#endif注意我只是把可能遇见的所有条件编译宏列了一下并不代表真正写的顺序就是这样。
至于#if defined 和#ifdef 的区别 #if defined 就是#if 的一种用法只不过后面跟了defined 对于#if后面需要是一个表达式如果表达式为1则调用#if下面的代码。 比如
#if defined(AA) || defined(BB) //和常规if一样只是判断当前是否定义了AA,BB用的是英文的过去时。defined 已经定义了。
#define WIDE_IN_SENSOR_ZOOM_LUX 390 //你的代码可以写很多
code...
#endif对于#ifdef后面需要的只是这个值有没有用#define定义并不关心define的这个值是0还是1。 比如在上面这里这个例子就可以接着这样写
#if defined(AA) || defined(BB) //和常规if一样只是判断当前是否定义了AA,BB用的是英文的过去时。defined 已经定义了。
#define WIDE_IN_SENSOR_ZOOM_LUX 390 //你的代码可以写很多
code...
#ifdef WIDE_IN_SENSOR_ZOOM_LUX //上面已经定义了WIDE_IN_SENSOR_ZOOM_LUX 接着执行下面代码
code..
#endif //时刻注意每个条件都应该一个endif
#endif还有一个区别就是#ifdef 只能判断一个宏如果判断多个宏只能用 #if defined() || defined () || defined ()
避免头文件被多次包含预处理时重复include)
那么最后回到我们的正题一般我们能在头文件看到最开始这样定义
#ifndef A_H //这个地方不需要和头文件名一样理解这句话你就明白避免重复包含的真正含义了而不是单纯记一个八股文知识点。
#defined A_H
code...
#endif上面是通常的写法一般重复包含指的是 我们在a.cpp中
#include a.h
#include b.h但是在a.h中我们又
#include b.h这样在预处理阶段展开#include a.h 时候会递归展开b.h, 然后#include b.h又展开一遍这就是重复包含了。 虽然我们自己在写程序的时候一般不会编译报错。因为我们写的都是小程序并不是大型的工程但是在大型工程中可能会因为重复包含而编译出错。 回到上面那么我们在头文件中使用这三行就相当于一个开关 比如在b.h中写上这三行。那么我们第一次展开a.h时候将b.h展开,然后就会判断是否定义 B_H 这个宏然后定义再执行代码。
#ifndef B_H
#defined B_H
code...
#endif下一次再展开b.h时候就会再次判断但这是我们已经定义过了就不会再次定义也不会再次执行我们的代码也就是不会再次在预处理阶段展开。 也就是不会在#include b.h 处再次将这一行替换为头文件中代码。因为#include b.h 在预处理阶段会替换为头文件中代码。
总结
所以总结来说就是用条件编译定义一个宏作为一个开关去判断是否include当前头文件。以此避免重复定义