zoukankan      html  css  js  c++  java
  • C++编译预处理

    C++的预处理是编译器在编译源程序之前,先由预处理器处理预处理指令,由于在C++源程序中有各种编译命令,而这些编译命令由于是在程序被正常编译之前执行的,故称为预处理命令(或指令)。预编译命令用来扩充C++程序设计的环境,使得程序书写变得更加简练和清晰。
    C++提供的预处理功能主要有以下3种:
    宏定义命令。
    文件包含命令。
    条件编译命令。

    为了与一般C++语句相区别,编译预处理命令以符号#开头,并且末尾不包含分号习惯上编译命令都是放在程序的开头。

    宏定义

    宏定义命令是将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的宏定义串称为替换文本。宏定义命令有两种格式:即简单的宏定义,和带参数的宏定义

    1.宏定义的一般形式

    宏定义的一般形式如下:

     #define宏名 字符 //其中: define是宏定义的关键字,“宏名”是需要替换的标识符,“字符串”是被指定用来替换的字符序列。

    例如:

     #define PI 3.1415926;//程序中可以使用标识符PI,编译预处理后产生一个中间文件,文件中所有PI都被替换为3.1415926

    说明:

    (1)#define、宏名和字符串之间一定要有空格。
    (2)宏名一般用大写字母表示,以区别于普通标识符。
    (3)宏被定义以后,一般不能再重新定义。但可以用#undef来终止宏定义。
    (4)一个定义过的宏名可以用来定义其他新的宏,但要注意其中的括号。例如:

     define A 20;
    
    #define B (A+10);

    2.#define与const的比较:

    C++中,虽然用宏定义可以定义符号常量,但常用 const来定义符号常量

    例如 const double Pl=3.1415926;与#define PI 3.145926都是将标识符PI定义为3.1415926,但是,这两种又是有区别的。
    不同点:
    (1). 时期:#define是在编译的预处理阶段展开,而const是在 编译、运行的时候起作用
    (2). #define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误
    (3). 就存储方式而言:define宏在定义时不会分配内存,#define只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存中有若干个备份;const常量在定义时会在内存中分配(可以是堆中也可以是栈中),const定义的只读变量在程序运行过程中只有一份备份。

    所以我们更推荐用const来定义符号常量

    3.带有参数的宏定义

    例如:
    #define MAX(a,b)a>b?a:b如果在程序中出现如下语句:
    S=MAX(4,6);
    则被替换为:
    s=4>6?4:6;
    对于带参数的宏的展开,只是将语句中的宏名后面括号内的实参字符串代替#define命令行中的形参,例如上例用MAX(4,6),在展开时,4对应a,6对应b,替代宏定义中的字符串a>b?a:b,得到4>6?4:6如果有如下宏定义:
     #define SOR(a) a*a;对于如下语句:
    是被指定 z=SQR(x+y);
    这时,将以形参x+y代替a*a中a,成为:
    z=x+y*x+y;
    需要注意的是,在x+y外面没有括号,显然这与设计者的原意不符,原意是希望得到:
    将被替换z=(x+y)*(x+y);
    为了得到这个结果,应当在宏定义时,在字符串的形式参数外面加上一个括号,避免歧义。即:
     #define SOR(a) (a)*(a);
    这样再对z=SQR(x+y)进行宏展开时,使用x+y代替(a)*(a)中a,就成为z=(x+y)*(x+y);的形式。

    文件包含命令

    所谓“文件包含”,是指将另一个源文件的全部内容包含到当前的源文件中。在C++中,文件包含命令的一般形式为:

    #include<文件名>//或 #include"文件名”

    文件名一般是以.h为扩展名,称为“头文件。文件包含的这两种格式区别在于:将文件名用<>括起来,用来包含那些由C++系统提供的并放在指定子目录中的头文件;而将文件名用双引号括起来的,是用来包含用户自己定义的放在应用程序当前目录或其他目录下的头文件或其他源文件。
    文件包含可以将头文件中的内容直接引入,而不必再重复定义,减少了重复劳动,节省了编程时间。

    条件编译命令

    在一般情况下,源程序中的所有语句都会参加编译,但是有时候会希望根据一定的条件编译源文件的部分语句,这就是“条件编译”。条件编译使得同一源程序在不同的编译条件下得到不同的目标代码。

    C++中,常用的条件编译命令有如下三种。

     (1)#ifdef-#else-#endif:

    #ifdef 标识符 
    
    程序段1 
    
    #else
    
    程序段2 
    
    #endif

    该条件编译命令的功能是:如果在程序中#define中定义了指定的“标识符”时,就用程序段1参与编译,否则,用程序段2参与编译。

    看个例子:

    #include <iostream>  
    
    int main()  
    
    {  
    
    #ifdef DEBUG   
    
    cout<< "Beginning execution of main()";  
    
    #endif   
    
    return 0;  
    
    }

    更改下代码:

    #include <iostream>
    
    #define DEBUG  
    
    int main()  
    
    {  
    
    #ifdef DEBUG   
    
    cout<< "Beginning execution of main()";  
    
    #endif   
    
    return 0;  
    
    }

     (2) #ifndef-#else-#endif: 

    #ifndet 标识符  
    
    程序段1 
    
    #else
    
    程序段2 
    
    #ebdif

    该条件编译命令的功能是:如果在程序中定义指定的“标识符”,就用程序段1参与编译,否则,用程序段2参与编译。

     (3) #if-#elif-#else-#tendif:

    #if常量表达式1
    
    程序段1
    
    #elif常量表达式2
    
    程序段2
    
    .......
    
    #elif常量表达式n
    
    程序段n 
    
    #else程序段n+1 
    
    #endif

    该条件编译命令的功能是:依次计算常量表达式的值,当表达式的值为真时,则用相应的程序段参与编译,如果全部表达式的值都为假,则用else后的程序段参与编译。
    【示例

    #include <iostream>
    using namespace std;
    #define k  - 5
    
    int main() {
    #if k>0 
        cout<<"a>"<<endl;
    #elif k<0
        cout << "a<0" << endl;
    #else 
        cout<<"a=0"<<endl;
    #endif
        system("pause");
        return 0;
    }

  • 相关阅读:
    dedecms自定义表单提交获取时间跟ip地址
    JQuery购物车多物品数量的加减+总价计算
    jquery手机触屏滑动拼音字母城市选择器代码
    js实现图片上传实时显示
    js实现发送验证码倒计时效果
    JS 仿支付宝input文本输入框放大组件
    js实现倒计时效果
    jquery统计输入文字的个数并对其进行判断
    【Linux】Linux系统安全设置
    java泛型(generics)
  • 原文地址:https://www.cnblogs.com/CX66/p/13942019.html
Copyright © 2011-2022 走看看