一、什么是预处理指令

           预处理指令是告诉编译器在编译之前预先处理的一些指令,有宏定义,文件包括,条件编译。

预处理指令一般以 # 号开头,能够出如今文件的不论什么地方,作用于整个文件。 
二、宏定义

        宏定义分不带參数的和带參数的宏定义。

    1➢不带參数的宏定义

       
 #import <stdio.h>

    #define AGE 10 // 宏名用大写

    int main()
{
int age = AGE; // AGE在编译之前会替换成 10 printf("%d", age); return 0;
}

在编译器编译之前,代码中的全部AGE会被替换成 10 ,当AGE的值要改动的时候仅仅须要在定义宏的地方改动一次,文件里的全部AGE都会被替换成新的值。  

    因为宏是在编译之前被替换,所以由此引起的语法错误仅仅有等到编译的时候才会对已经被替换在宏名作语法检查。

        能够在定义一个宏时,引用已经定义的宏,如:

//
// main.m
// 预处理指令
//
// Created by 葬花 桥 on 14-5-18.
// Copyright (c) 2014年 itcast. All rights reserved.
// #import <stdio.h> #define AGE 10 // 宏名用大写 #define AGE2 AGE+10 // 引用已经定义的宏 int main()
{
int age = AGE; // AGE在编译之前会替换成 10
int age2 = AGE2; printf("age1=%d\nage2=%d", age, age2); return 0;
}

2➢带參数的宏定义

            带參数的宏定义和看起来和函数有点相似 ,可是它们的本质的差别,宏定义仅仅是替换,不分配内存,没有參数的传送,更没有返回值。

#define  SUM(a,b) a+b // 带參数的宏定义



            这里的宏SUM带有參数,使用时会替换成这样:

 三、文件包括

       文件包括预编译指令我们都在用,#include<>   #import 等等

它会将目标文件的内容拷贝一份到当前文件里,这非常easy,没有什么能够多说的。仅仅是要注意反复包括,循环包括造成的错误,反复定义错误或循环包括错误。

            可是假设用到了条件编译就能避免反复包括引起的反复定义错误。

四、条件编译

            
#if defined(SUM)
printf("SUM已经被定义!\n");
#endif
       这现个预处理指令表示假设SUM已经被定义就编译printf语句,与些相反的是

#if !defined(SUM)
printf("SUM没有被定义!\n");
#endif

假设SUM没有被定义,就编译printf语句



             与这两个同样作用的是

#ifdef SUM // 与#if defined(SUM)同样

#endif

#ifndef SUM // 与#if !defined(SUM)同样
#endif

那么在文件包括时,使用条件编译就能够防止反复包括同一个文件。


C学习笔记之预处理指令的更多相关文章

  1. C#学习笔记:预处理指令

    C#和C/C++一样,也支持预处理指令,下面我们来看看C#中的预处理指令. #region 代码折叠功能,配合#endregion使用,如下: 点击后如下: 条件预处理 条件预处理可以根据给出的条件决 ...

  2. angular学习笔记(三十)-指令(10)-require和controller

    本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐direct ...

  3. angular学习笔记(三十)-指令(7)-compile和link(2)

    继续上一篇:angular学习笔记(三十)-指令(7)-compile和link(1) 上一篇讲了compile函数的基本概念,接下来详细讲解compile和link的执行顺序. 看一段三个指令嵌套的 ...

  4. angular学习笔记(三十)-指令(7)-compile和link(1)

    这篇主要讲解指令中的compile,以及它和link的微妙的关系. link函数在之前已经讲过了,而compile函数,它和link函数是不能共存的,如果定义了compile属性又定义link属性,那 ...

  5. angular学习笔记(三十)-指令(6)-transclude()方法(又称linker()方法)-模拟ng-repeat指令

    在angular学习笔记(三十)-指令(4)-transclude文章的末尾提到了,如果在指令中需要反复使用被嵌套的那一坨,需要使用transclude()方法. 在angular学习笔记(三十)-指 ...

  6. angular学习笔记(三十)-指令(5)-link

    这篇主要介绍angular指令中的link属性: link:function(scope,iEle,iAttrs,ctrl,linker){ .... } link属性值为一个函数,这个函数有五个参数 ...

  7. angular学习笔记(三十)-指令(2)-restrice,replace,template

    本篇主要讲解指令中的 restrict属性, replace属性, template属性 这三个属性 一. restrict: 字符串.定义指令在视图中的使用方式,一共有四种使用方式: 1. 元素: ...

  8. JVM学习笔记——字节码指令

    JVM学习笔记——字节码指令 字节码 0与 1是计算机仅能识别的信号,经过0和1的不同组合产生了数字之上的操作.另外,通过不同的组合亦产生了各种字符.同样,可以通过不同的组合产生不同的机器指令.在不同 ...

  9. 汇编学习笔记(11)int指令和端口

    格式 int指令也是一种内中断指令,int指令的格式为int n,n是中断类型码.也就是说,使用int指令可以调用任意的中断例程,例如我们可以显示的调用0号中断例程,还记得在汇编学习笔记(10)中我们 ...

随机推荐

  1. MMU、Icache、Dcache

    http://blog.csdn.net/iodoo/article/details/8954014 i-cache(instruction cache)是指令高速缓冲存储器. Cache存储体:存放 ...

  2. RUST叫系统编程语言,而GO是网络编程语言

    用GO你必须要搞清楚一点,GO不是面向CPU密集计算的,而是面向IO密集计算的!!!RUST才是面向CPU密集计算的语言,所以RUST叫系统编程语言,而GO是网络编程语言.GO跟JAVA的Spring ...

  3. Python sh库学习 上篇

    官方文档有句话"allows you to call any program",并且:helps you write shell scripts in Python by givi ...

  4. Oracle EBS R12 WIP Component Issue&Return Process

    oracleassemblytransactionscomponentsjobsreference 目录(?)[-] 定义BOM 定义Routing 定义WIP Discrete Job 发料 Mat ...

  5. Html——footer的使用

    html部分 <div class="container"> <div class="body"></div> <di ...

  6. 教程 打造OS X Mavericks原版 EFI Clover 引导安装

    自从 Mavericks 10.9 发布DP版到现在的GM版以来,以前Clover引导原版InstallESD.dmg方式安装原版的方法已经不能使用,而且已经不能引导安装了,所以从GM版发布以前,终于 ...

  7. 【 D3.js 选择集与数据详解 — 4 】 enter和exit的处理方法以及处理模板

    绑定数据之后,选择集分为三部分:update.enter.exit.这三部分的处理办法是什么呢?本文将讲解其处理方法,以及一个常用的处理模板. 1. enter的处理方法 如果没有足够的元素,那么处理 ...

  8. .net HTMLParser详细使用说明 强大的Filter类 解析HTML文档如此简单

    背景: HTMLParser原本是一个在sourceforge上的一个Java开源项目,使用这个Java类库可以用来线性地或嵌套地解析HTML文本.他的 功能强大和开源等特性吸引了大量Web信息提取的 ...

  9. MEF学习小结 z

    1.什么是MEF. MEF,全称是Managed Extensibility Framework.它是.NET Framework4.0的一个类库,其主要目的是为了创建可扩展的应用程序.按照官方说法就 ...

  10. [liu yanling]测试用例设计综合策略

    Myers提出了使用各种测试方法的综合策略: 1)    在任何情况下都必须使用边界值分析方法,经验表明用这种方法设计出测试用例发现程序错误的能力最强. 2)    必要时用等价类划分方法补充一些测试 ...