/****************************************************************************

Title:C之预处理命令

Time:2014年7月26日

**************************************************************************/

        大一时学过,C语言中预处理命令功能分为3种。(宏定义,文件包含和条件编译)

  一:宏定义    

      格    式       #define  标识符   字符串,
      功    能        预处理功能
      别    名        宏代换
 
      其中的标识符就是所谓的符号常量,也称为“宏名”。
      预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。
 
       理解 :  握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就              要“换”,即在对相关命令或语句的含义和功能作具体分析之前就要换:
          
            例子:

 # define Pi 3.1415926

 int  s;
int r=;
void main()
{
s=pi*r; } //功能:将程序中的Pi全部替换成3.1415926常数

      另外一种是带参数的宏,C课本上后面的题目很多,唯一记住的是

      #define S(r) r*r
      area=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;
      正确的宏定义是#define S(r) ((r)*(r)),不要弄错哦
 
  二:文件包含

  

    C语言文件包含与头文件写法

    C语言文件包含的处理方法:

    (1)处理时间:

        (#include)预处理阶段

    (2)处理方法:在预处理阶段,系统自动对#include命令进行处理。具体做法是:将包含文件的内容复制到包含语句(#include)处,得到新的文件,然后对新的文件进行编译。

      一般情况下包含文件分为两种:包含.h 文件和包含.c文件包含.c文件的编译和编译多文件程序(包含.h的文件就是如此) 是不同的

      例子:  

 #include <stdio.h>
//#include "fun.c"
int main()
{
int a = , b = ; c = a; sun(a, b);
printf("\r\n c = %d\r\n", c);
return ;
} /*end of file1*/ [cpp] view plaincopy [cpp] view plaincopy
/*file2: fun.c*/
int c = ;
void sun(int a, int b)
{
printf("\r\n a + b = %d\r\n", a+b);
[cpp] view plaincopy c = ;
printf("\r\nc = %d\r\n", c);
}

    再来一个包含.h的头文件吧

  

 #include "stm32f10x.h"
#include "bsp_led.h" void Delay(__IO u32 nCount); int main(void)
{ LED_GPIO_Config();
while ()
{
  LED1( OFF );
  Delay(0x0FFFFF*);
   LED1( ON );
   Delay(0x0FFFFF*);
}
} void Delay(__IO uint32_t nCount) //简单延时代码
{
for(; nCount != ; nCount--);
}

     三:条件编译

          一般情况下,源程序中所有的行都参加编译。但有时希望对其中一部分内容只在满足一定条件下才进行编译,即对一部分内容指定编译条件,这就是“条件编译”(conditional compile)。条件编译语句排版时,需考虑以下三种位置:

      1)条件编译语句块与函数定义体之间不存在相互嵌套(主要在(.h)文件中);

      2)条件编译语句块嵌套在函数体之外(主要在(.c)文件中);

      3)条件编译语句嵌套在函数体内 (主要在(.c)文件中)。条件编译指令将决定哪些代码被编译,而哪些是不被编译的。可根据表达式的值或某个特定宏是否被定义来确定编译条件。

指令编辑

条件编译指令将决定哪些代码被编译,而哪些是不被编译的。可以根据表达式的值或者某个特定的宏是否被定义来确定编译条件。

#if、#else、#elif和#endif指令

一般形式有如下几种
(1)
 #if 表达式
// 语句段1
[#else
// 语句段2]
#endif
如果表达式为真,就编译语句段1,否则编译语句段2[1] 
(2)
 #if 表达式1
// 语句段1
#elif 表达式2
// 语句段2
#else
// 语句段3
#endif
如果表达式1真,则编译语句段1,否则判断表达式2;如果表达式2为真,则编译语句段2,否则编译语句段3

#ifdef和#ifndef

(1)#ifdef的一般形式:[1]
    #ifdef 宏名 // 语句段 #endif 
 
 
作用:如果在此之前已定义了这样的宏名,则编译语句段。
 
(2)#ifndef的一般形式:[1] 
 
    #ifndef 宏名 // 语句段 #endif 
 
作用:如果在此之前没有定义这样的宏名,则编译语句段。
#else可以用于#ifdef和#ifndef中,但#elif不可以。

#error

指令将使编译器显示一条错误信息,然后停止编译。

#line

指令可以改变编译器用来指出警告和错误信息的文件号和行号。

#pragma

指令没有正式的定义。编译器可以自定义其用途。典型的用法是禁止或允许某些烦人的警告信息。

举例

 #include <stdio.h>
#define LETTER 1
int main( int argc, char * argv[] )
{
char str[]="C Language",c;
int i;
i=;
while( (c=str[i]) != '\0' )
{
i++;
#if LETTER
if( c>='a' && c<='z' )
c=c-;
#else
if( c>='A' && c<='Z' )
c=c+;
#endif
printf( "%c",c );
}
return ;
}
 
    运行结果为C LANGUAGE

 常用预处理命令     

 #空指令,无任何效果
#include包含一个源代码文件
#define定义宏
#undef取消已定义的宏
#if如果给定条件为真,则编译下面代码
#ifdef如果宏已经定义,则编译下面代码
#ifndef如果宏没有定义,则编译下面代码
#elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
#endif结束一个#if……#else条件编译块
#error停止编译并显示错误信息

欢迎大家一起交流 ,分享程序员励志故事。   幸福的程序员 QQ群:160441098

C语言之预处理命令的更多相关文章

  1. 【C语言入门教程】2.8 C 语言的预处理命令

    预处理命令是在程序编译阶段进行执行的命令,用于编译与特定环境相关的可执行文件.预处理命令扩展了 C 语言,本节将选择其中一些常用的预处理命令进行讲解. 2.8.1 宏替换命令 宏替换命令的作用类似于对 ...

  2. C语言之预处理命令与用typedef命名已有类型

    预处理命令 主要是改进程序设计环境,以提高编程效率,不属于c语言本身的组成部分,不能直接对它们进行编译,必须在对 程序编译之前,先对程序中的这些特殊命令进行“预处理”.比如头文件. 有以下三类:宏定义 ...

  3. C语言include预处理命令与多文件编译

    #include预处理命令几乎使我们在第一次接触C的时候就会碰到的预处理命令,可我现在还不怎么清楚,这次争取一次搞懂. 一.#include预处理指令的基本使用 预处理指令可以将别处的源代码内容插入到 ...

  4. C语言:预处理命令总结

    预处理指令是以#号开头的代码行,# 号必须是该行除了任何空白字符外的第一个字符.# 后是指令关键字,在关键字和 # 号之间允许存在任意个数的空白字符,整行语句构成了一条预处理指令,该指令将在编译器进行 ...

  5. C语言的预处理命令

    C语言编译器处理时经过的第一个步骤是预处理,就是从.c文件处理为.i文件.在预处理时编译器做了一些展开替换的处理. 1>头文件展开,即将#include "stdio.h"类 ...

  6. Fluent UDF【6】:预处理命令

    今天要讲的内容是关于C语言的预处理.搞清楚了这个,就可以分析UDF中的各种头文件源代码,从此写UDF不求人. 1 关于预处理 在UDF的各种头文件中(文件路径D:\Program Files\ANSY ...

  7. 不可或缺 Windows Native (4) - C 语言: 预处理命令,输入,输出

    [源码下载] 不可或缺 Windows Native (4) - C 语言: 预处理命令,输入,输出 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 预处理命令 输入 ...

  8. C语言预处理命令总结大全

    C程序的源代码中可包括各种编译指令,这些指令称为预处理命令.虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境.本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性.ANS ...

  9. C语言第十一讲,预处理命令.

    C语言第十一讲,预处理命令. 一丶预处理简介 什么是预处理,预处理就是预先处理. 我们知道,程序会经过编译,连接形成可执行文件 这些在编译之前对源文件进行简单加工的过程,就称为预处理(即预先处理.提前 ...

随机推荐

  1. RAC之RMAN恢复

    之前整理的RMAN 有关还原的文章: RMAN 系列(五) ---- RMAN 还原 与 恢复 http://blog.csdn.net/tianlesoftware/archive/2010/07/ ...

  2. Windows 8.1 正式版镜像下载大全

    该系统已有更新的版本,请转至<Windows 8.1 with update 官方最新镜像汇总>下载. [声明:所有资源均来自于网络,请购买正版授权后再使用.]Win8.1 正式版原版镜像 ...

  3. DragonBoard810使用记录

    1. 执行~/workdir/Source_Package$ getSource_and_build.sh后该脚本先下载android仓库.repo到~目录,然后将android源码check out ...

  4. C#优秀开源资料收集

    1. 把对命令行程序的调用封装起来,通过程序里进行输入,调用命令行程序的输出显示在程序中 http://www.codeproject.com/Articles/335909/Embedding-a- ...

  5. unix c 07

    进程的结束函数 (exit._Exit)    exit 并不是立即退出,退出前执行 用atexit/on_exit函数 注册的函数.    exit(int status)中的status可以用 w ...

  6. tabbar 嵌套 navigation

    -------------- 源代码:点击打开链接 ------------------------ AppDelegate.m - (BOOL)application:(UIApplication ...

  7. 数据库中的索引Index

    索引就像一本书的目录,而书中的索引是对一个词语的列表,其中注明了包含各个词的页码.数据库中的索引 是某一个表中一列或者若干列值的集合和相应的只想表中物理标识这些值的数据页的逻辑指针清单. 索引的作用: ...

  8. .NET 面试题(1)

    1.简述 private. protected. public. internal 修饰符的访问权限. private:私有成员,在类的内部才能访问 protected:保护成员,在该类内部和继承本类 ...

  9. OpenReports中文支持方案

    此文章在<OpenReports中文支持完全解决方案.doc>的基础上做优化,并贴出代码.已测试通过. 一.主要解决的问题 1 页面显示支持中文 2 与服务器或数据库的交互支持中文 3 查 ...

  10. poj1330Nearest Common Ancestors(LCA小结)

    题目请戳这里 题目大意:意如其名. 题目分析:本题只有一个查询,所以可以各种乱搞过去. 不过对于菜鸟而言,还是老老实实练习一下LCA算法. LCA有很多经典的算法.按工作方式分在线和离线2种. tar ...