预处理是指在编译器之前运行,常以“#”开头

包含3个方面的内容:

1)宏定义与宏替换

2)文件包含

3)条件编译

  • 宏定义与宏替换:

宏名一般大写,替换发生在编译之前,且是机械替换,不做语法检查,也不分配内存,不占用运行时间,只占用编译时间。由于宏常量没有类型,编译时不会进行类型安全检查,且进行字符替换时可能会出现错误。两种类型:

1)符号常量的宏定义和宏替换  #define 标识符 字符串

 #include<iostream>
#define P 3+4
using namespace std;
void main()
{
int a=;
cout<<a*P<<endl; //相当于a*3+4,而不是a*(3+4),机械替换
}

结果:

2)带有参数的宏定义和宏替换 #define 标识符(参数列表) 字符串

 #include<iostream>
#define FUN(a) a*a
using namespace std;
void main()
{
cout<<FUN(+)<<endl; //机械替换,2+3*2+3
}

结果:

  • 文件包含

#include的作用是把它后面所写的那个文件的内容,完完整整地、 一字不改地包含到当前的文件中来。把每一个它出现的地方,替换成它后面所写的那个文件的 内容。两种形式:

1)#include<filename>  认为该文件是标准头文件,先到标准库中寻找,若没有,再到当前目录下寻找

2)#include"filename"  一般认为是用户自定义文件,先到当前目录寻找,若没有,再到类库中寻找

  • 条件编译

格式:

#if/ifdef/ifndef

#elif

#else

#endif

作用:一般用在头文件中,避免多重包含,在源程序中引入头文件,相当于把头文件的内容复制到源文件当中。这里涉及到两个概念“定义”和“声明”,“定义”是功能的实现,把一个符号进行具体的描述,而声明只是说明符号的存在即可。我们都知道,一个符号可以多次声明,但只能定义一次。那么头文件的引用就涉及到了这个问题,当一个函数fun()在头文件source中进行定义后,若类A中包含该文件,类B也包含该文件,而在源文件C中用到了A和B,#include“A” 和#include"B"时,source在C中包含了两次,会出现fun()的多次定义,导致错误。

采用条件编译可以防止此类问题发生

 #ifndef S
#define S
//类的定义
#endif

在进行编译时会判断S是否被定义过,若定义过,则#ifndef后面的内容不执行,从而保证头文件只被处理一次

C预处理,条件编译的更多相关文章

  1. 条件编译#ifdef的妙用详解_透彻

    这几个宏是为了进行条件编译.一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部 分内容指定编译的条件,这就是“条件编译”.有时,希望当满足某条 ...

  2. 史上最全条件编译解析 #ifdef #ifndef #undef #else #endif

    C语言和C++语言程序中广泛存在着#ifdef或#ifndef等条件编译语句,本篇就系统介绍下他们的用法. 这几个宏是为了进行条件编译.一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分 ...

  3. 条件编译#ifdef的妙用详解

    c语言中条件编译相关的预编译指令,包括  #define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. #define           ...

  4. 预处理ifndef

    #ifdef 详解 这几个宏是为了进行条件编译.一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”.有 ...

  5. C语言预处理_05

    凡是以 “#”开头的均为预处理命令! 其定义的一般形式为: #define  标示符  字符串 对于宏定义说明以下几点: 1.宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种 ...

  6. c语言之【#ifdef】

    电脑程序语句,我们可以用它区隔一些与特定头文件.程序库和其他文件版本有关的代码. 1 2 3 #ifdef 语句1     // 程序2 #endif 可翻译为:如果宏定义了语句1则程序2. 作用:我 ...

  7. C 和 Object- C 中得 #ifdef 和#ifndef

    很多宏是为了进行条件编译.一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”.有时,希望当满足某条件时 ...

  8. ifndef/define/endif 的作用

    转载自百度百科 ,感谢度娘 1 2 3 #ifdef语句1 //程序2 #endif 可翻译为:如果宏定义了语句1则执行程序2. 作用:我们可以用它区隔一些与特定头文件.程序库和其他文件版本有关的代码 ...

  9. #ifndef#define#endif的用法-b

    The special operator defined is used in #if and #elif expressions to test whether a certain name is ...

  10. c语言中的#ifndef、#def、#endif等宏是什么意思

    #ifndef.(或者#ifndef).#def.#endif等宏这几个宏是为了进行条件编译.一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一 ...

随机推荐

  1. highcharts设置Area颜色透明度

    $(function () { $('#container').highcharts({ chart: { type: 'area' }, xAxis: { categories: ['Jan', ' ...

  2. Linux之apt-get无sudo权限安装软件

    apt-get source package cd package ./configure --prefix=$HOME make make install

  3. 数据字典系统,要的进来下载吧,MVC+Easyui写的

    数据字典系统,要的进来下载吧,以后做开发不用单独去生成一个数据字典了,直接打开此系统就OK啦 使用VS2012写的 语法是SQL 2005以上版本,包含2005的哦,2000的不适用此系统 字数不够啦 ...

  4. ASP.NET缓存全解析5:文件缓存依赖 转自网络原文作者李天平

    这种策略让缓存依赖于一个指定的文件,通过改变文件的更新日期来清除缓存. ///<summary> /// 获取当前应用程序指定CacheKey的Cache对象值 ///</summa ...

  5. Part 7 Joins in sql server

    Joins in sql server Advanced or intelligent joins in sql server Self join in sql server Different wa ...

  6. Swift 概述及Swift运算符和表达式

    Swift  是用于设计 iOS 及 Mac OS X 应用的一门新 语言. Swift 特点 •   Swift  保留了 C  与 Objective-C 的优点,并摒弃 其为了兼容 C  语言所 ...

  7. Window下配置NodeJs环境详解

        今年打算学习Web这块,所以就买了本Node.js+MongoDb+AngularJS这本书,这周天也比较忙,想着录视频(拍小片,不是AV,不要误会,是在线课程)的事情,这周又将Asp.Net ...

  8. List.Select按字符串选择属性

    不知道大家有没有遇到这样的情况:List使用Lambda表达式的时候,想要选择项的某个属性列. 例如,选择编号ID: var idList=list.Select(o=>o.ID).ToList ...

  9. 解析json数据总结

    json格式的数据一般就是两种类型的,一种是数组类型的,一种是对象类型的. 数组类型:[{"id":"a001","name":" ...

  10. 洛谷 P1195 口袋的天空

    题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在 ...