首页 > 代码库 > C语言之预处理命令

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 plaincopy14 /*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     // 语句段13 [#else4     // 语句段2]5 #endif

 

如果表达式为真,就编译语句段1,否则编译语句段2[1] 
(2)
1 #if 表达式12     // 语句段13 #elif 表达式24     // 语句段25 #else6     // 语句段37 #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 LETTER12         if( c>=a && c<=z )13         c=c-32;14 #else15         if( c>=A && c<=Z )16         c=c+32;17 #endif18         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幸福的程序员