• C预处理,条件编译


    预处理是指在编译器之前运行,常以“#”开头

    包含3个方面的内容:

    1)宏定义与宏替换

    2)文件包含

    3)条件编译

    • 宏定义与宏替换:

    宏名一般大写,替换发生在编译之前,且是机械替换,不做语法检查,也不分配内存,不占用运行时间,只占用编译时间。由于宏常量没有类型,编译时不会进行类型安全检查,且进行字符替换时可能会出现错误。两种类型:

    1)符号常量的宏定义和宏替换  #define 标识符 字符串

    1 #include<iostream>
    2 #define P 3+4
    3 using namespace std;
    4 void main()
    5 {
    6  int a=2;
    7 cout<<a*P<<endl;  //相当于a*3+4,而不是a*(3+4),机械替换
    8 }

    结果:

    2)带有参数的宏定义和宏替换 #define 标识符(参数列表) 字符串

    1 #include<iostream>
    2 #define FUN(a) a*a
    3 using namespace std;
    4 void main()
    5 {
    6     cout<<FUN(2+3)<<endl;  //机械替换,2+3*2+3
    7 }

    结果:

    • 文件包含

    #include的作用是把它后面所写的那个文件的内容,完完整整地、 一字不改地包含到当前的文件中来。把每一个它出现的地方,替换成它后面所写的那个文件的 内容。两种形式:

    1)#include<filename>  认为该文件是标准头文件,先到标准库中寻找,若没有,再到当前目录下寻找

    2)#include"filename"  一般认为是用户自定义文件,先到当前目录寻找,若没有,再到类库中寻找

    • 条件编译

    格式:

    #if/ifdef/ifndef

    #elif

    #else

    #endif

    作用:一般用在头文件中,避免多重包含,在源程序中引入头文件,相当于把头文件的内容复制到源文件当中。这里涉及到两个概念“定义”和“声明”,“定义”是功能的实现,把一个符号进行具体的描述,而声明只是说明符号的存在即可。我们都知道,一个符号可以多次声明,但只能定义一次。那么头文件的引用就涉及到了这个问题,当一个函数fun()在头文件source中进行定义后,若类A中包含该文件,类B也包含该文件,而在源文件C中用到了A和B,#include“A” 和#include"B"时,source在C中包含了两次,会出现fun()的多次定义,导致错误。

    采用条件编译可以防止此类问题发生

    1 #ifndef S
    2 #define S
    3 //类的定义
    4 #endif

    在进行编译时会判断S是否被定义过,若定义过,则#ifndef后面的内容不执行,从而保证头文件只被处理一次

  • 相关阅读:
    [Python] wxPython 高防Windows10记事本 (end...)
    C++模板学习:函数模板、结构体模板、类模板
    【English】十六、时间相关
    【English】十五、“a”和“one”的区别是什么?
    【English】十四、英语
    【English】十三、英语中的连词有哪些,都有什么作用
    【English】十二、英语句子种类,陈述句、疑问句、祈使句、感叹句
    【English】十一、一般疑问句
    【English】十、"谓语的地方"看到有两个动词:I go say hello.、非谓语形式
    【English】九、kids/children/toddlers 三个单词的区别
  • 原文地址:https://www.cnblogs.com/mrlsx/p/5442957.html
Copyright © 2020-2023  润新知