C语言之预处理命令

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

Title:C之预处理命令

Time:2014年7月26日

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

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

  一:宏定义    

      格    式       #define  标识符   字符串,

      功    能        预处理功能

      别    名        宏代换

      其中的标识符就是所谓的符号常量,也称为“宏名”。

      预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。

       理解 :  握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就              要“换”,即在对相关命令或语句的含义和功能作具体分析之前就要换:

          

            例子:

 1 # define Pi 3.1415926
 2
 3 int  s;
 4 int  r=2;
 5 void main()
 6 {
 7        s=pi*r;
 8
 9 }
10
11 //功能:将程序中的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的文件就是如此) 是不同的

      例子:  

 1 #include <stdio.h>
 2 //#include "fun.c"
 3 int main()
 4  {
 5        int a = 5, b = 19;       c = a;   sun(a, b);
 6       printf("\r\n c = %d\r\n", c);
 7       return 0;
 8   }
 9
10
11  /*end of file1*/   [cpp] view plaincopy
12
13 [cpp] view plaincopy
14 /*file2: fun.c*/
15    int c = 0;
16   void sun(int a, int b)
17  {
18          printf("\r\n a + b = %d\r\n", a+b);
19        [cpp] view plaincopy     c = 0;
20       printf("\r\nc = %d\r\n", c);
21    }         

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

  

 1 #include "stm32f10x.h"
 2 #include "bsp_led.h"
 3
 4 void Delay(__IO u32 nCount);
 5
 6
 7 int main(void)
 8 {
 9
10     LED_GPIO_Config();
13     while (1)
14     {
15       LED1( OFF );
16       Delay(0x0FFFFF*10);
17       LED1( ON );
18       Delay(0x0FFFFF*10);
19     }
21 }
22
23 void Delay(__IO uint32_t nCount)     //简单延时代码
24 {
25     for(; nCount != 0; nCount--);
26 }

     三:条件编译

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

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

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

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

指令编辑

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

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

一般形式有如下几种

(1)

1 #if 表达式
2     // 语句段1
3 [#else
4     // 语句段2]
5 #endif

如果表达式为真,就编译语句段1,否则编译语句段2[1]

(2)

1 #if 表达式1
2     // 语句段1
3 #elif 表达式2
4     // 语句段2
5 #else
6     // 语句段3
7 #endif

如果表达式1真,则编译语句段1,否则判断表达式2;如果表达式2为真,则编译语句段2,否则编译语句段3

#ifdef和#ifndef

(1)#ifdef的一般形式:[1]

   1 #ifdef 宏名 2 // 语句段 3 #endif 

作用:如果在此之前已定义了这样的宏名,则编译语句段。

(2)#ifndef的一般形式:[1] 

   1 #ifndef 宏名 2 // 语句段 3 #endif 

作用:如果在此之前没有定义这样的宏名,则编译语句段。

#else可以用于#ifdef和#ifndef中,但#elif不可以。

#error

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

#line

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

#pragma

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

举例

 1 #include <stdio.h>
 2 #define LETTER 1
 3 int main( int argc, char * argv[] )
 4 {
 5     char str[20]="C Language",c;
 6     int i;
 7     i=0;
 8     while( (c=str[i]) != ‘\0‘ )
 9     {
10         i++;
11 #if LETTER
12         if( c>=‘a‘ && c<=‘z‘ )
13         c=c-32;
14 #else
15         if( c>=‘A‘ && c<=‘Z‘ )
16         c=c+32;
17 #endif
18         printf( "%c",c );
19     }
20     return 0;
21 }

    运行结果为C LANGUAGE

 常用预处理命令     

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

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

C语言之预处理命令

时间: 2024-10-05 17:03:46

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

9、C语言之预处理命令

预处理命令 基本概念:ANSI C标准规定可以在C源程序中加入一些"预处理命令",以改进程序设计环境,提高编程效率. 这些预处理命令是由ANSI C同一规定的,但是它们不是C语言本身的组成部分,不能直接对它们进行编译(因为编译程序不能识别它们).必须在对程序进行通常的编译之前,先对程序中这些特殊的命令进行"预编译" 经过预处理后的程序可由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码. C语言与其他高级语言的一个重要区别是可以使用预处理命令和具

C语言的预处理命令

1.宏替换命令 编译器遇到宏替换命令所定义的标识符时,用其后的字符串替换该标识符.用这种方式定义符号常量.形式如下: #define  标识符 字符串  #define    TRUE     1 //用 TRUE 表示1 #define     FALSE   0 //用 FALSE 表示0 另一用法是作为代换.宏名可取参量数,每次遇到宏名时,与之相连的形式参数由程序中的实际参数代替: #define     MAX(a ,b) ( a >= b ) ? a : b #define MAX(a

C语言第十一回合:预处理命令的集中营

  [学习目标]   1.         宏定义 2.         文件包括"处理 3.         条件编译 预处理命令:能够改进程序设计的环境.提高编程效率. 其功能主要有三种:宏定义.文件包括.文件编译. ANSI标准定义的C语言预处理指令预览表 A: 宏定义 (a)不带參数的宏定义 格式:#define标识符 字符串 如:#define PI 3.1415926 *标识符被称为:宏名 *在预编译时将宏名替换成字符串的过程为:宏展开. *#define 是宏定义命令 //求圆周长

C语言预处理命令详解

一  前言 预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作.预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置. 预处理是C语言的一个重要功能,它由预处理程序负责完成.当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译. C语言提供多种预处理功能,主要处理#开始的预编译指令,如宏定义(#define).文件包含(#include).条件编译(#ifdef)等.合理使用预处理功能编

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

C程序的源代码中可包括各种编译指令,这些指令称为预处理命令.虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境.本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性.ANSI标准定义的C语言预处理程序包括下列命令: #define,#error,#include,#if,#else,#elif,#endif,#ifdef,#ifndef,#undef,#line,#pragma等.非常明显,所有预处理命令均以符号#开头,下面分别加以介绍. 一 #define 命令#d

C语言中的预处理命令

预处理功能是C语言的重要功能. 问:为什么要预处理,什么是预处理? 答:我们知道高级语言的运行过程是通过编译程序(编译器)把源代码翻译成机器语言,实现运行的.编译程序的工作包含:语法分析.词法分析.代码生成.代码优化等.但是在正式编译之前还有一些工作要做,例如:去掉注释.变换格式之类的.C语言允许在源程序中包含预处理命令,正式编译(词法分析)前,先对这些命令进行"预处理":然后在进行通常的编译处理.预处理命令从语法上讲不是C语言的一部分,但扩展了C语言程序设计的环境,简化程序开发过程:

C08 C语言预处理命令

目录 宏定义 文件包含 条件编译 预处理命令 C语言的预处理:在编译之前进行的处理,不进行编译. C语言的预处理功能有: 宏定义 文件包含 条件编译 预处理命令以符号"#"开头.. 宏定义 不带参数的宏定义 宏定义又称为宏代换.宏替换,简称"宏".格式: #define 标识符 文本 其中的标识符就是符号常量,也称为"宏名". 预处理(预编译)工作也称为宏展开:将宏名替换为文本(这个文本可以是字符串.可以是代码等).例: #define PI 3

程序猿之--C语言细节15(预处理命令细节#error、运算符#和##、__FILE__、__LINE__)

主要内容:预处理命令细节#error.运算符#和##.__FILE__.__LINE__ #include <stdio.h> /* 包含这个头文件,并不是将其所有函数都链接进程序*/ /* ##运算符 */ #define MK_ID(n) i##n /* 表示将两个记号连接 */ int MK_ID(1), MK_ID(2),MK_ID(3); /* 预处理后变成int i1,i2,i3;*/ /* 定义多个type##_max函数,函数返回类型和参数类型用define决定 * 如GENE

预处理命令[#define]说明

宏定义 宏定义是对一些常见的变量.字符串等进行定义,被定义的数据在编译会进行自动替换.有时一些变量或字符串被多次使用,当需要修改时,就需要对源文件中它们出现的地方一一修改,效率比较低,而通过宏定义,只需要对定义进行一次修改,就可以实现批量修改,提高效率,或者有时有些数字或字符需要多次输入,而数字或字符又不是很规律时,输入就会比较繁琐且容易出错.通过宏义将为输入和维护带来便利. 定义的格式 #define 标识符 字符串 其中的“#”表示这是一条预处理命令.凡是以“#”开头的均为预处理命令.“de