zoukankan      html  css  js  c++  java
  • 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("
     c = %d
    ", 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("
     a + b = %d
    ", a+b);
    19        [cpp] view plaincopy     c = 0;  
    20       printf("
    c = %d
    ", 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]) != '' )
     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幸福的程序员

  • 相关阅读:
    (论坛答疑点滴)DataGrid模板列中控件的事件中怎么知道是哪行触发的事件?
    (论坛答疑点滴)怎么后台添加CheckBoxList并且得到选择结果
    (论坛答疑点滴)联合主键的情况怎么在DataGrid中利用DataKeys定位记录?
    (原创)按照一定的格式生成一定数量的随机数的例子
    (原创)DataGrid动态添加模板列的一个例子
    有的时候看似是对的往往是不对的
    (论坛答疑点滴)如何向某网址Post信息,并得到CookieContainer以便以后直接通过验证
    (论坛答疑点滴)怎么触发DataGrid模板列中控件的事件?
    (原创)利用vs.net快速开发windows服务(c#)
    (论坛答疑点滴)怎么给Table动态添加控件并且得到控件的值?
  • 原文地址:https://www.cnblogs.com/1hua1ye/p/3870319.html
Copyright © 2011-2022 走看看