• 【C++中预处理语句 include、define、if】


    1.预处理阶段

    一般执行过程
    预处理阶段,在实际发生编译之前就根据对应的预处理语句进行操作,等到预处理阶段完成之后才进行编译阶段 。

    2.预处理语句

    预处理语句主要有include、define、if 和 program。利用 # 进行标记

    2.1 include语句

    include语句就是将所包含的文件给复制到当前文件中.

    //Math1.h
    }
    
    //math11.cpp
    int sum_(int a, int b) {
    	return a + b;
    #include"Math1.h"  //等价于 }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    上诉代码中,利用include进行预处理,直接将"Math1.h"中的内容直接赋值过来。后面编译器编译math11.cpp实际上的内部执行内容是

    #line 1 "C:\\dev\\cppstudy\\hello\\hello\\math11.cpp"
    int sum_(int a, int b) {
    	return a + b;
    #line 1 "C:\\dev\\cppstudy\\hello\\hello\\Math1.h"
    }
    #line 4 "C:\\dev\\cppstudy\\hello\\hello\\math11.cpp"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    也就是

    int sum_(int a, int b) {
    	return a + b;
    }
    
    • 1
    • 2
    • 3

    2.2 define语句

    define语句底层实现就是一个简单的字符串替换,就是将指定的字符串替换成为目标字符串,然后再进行编译

    //math22.cpp
    #define INTEGER int
    INTEGER sum_(INTEGER a, INTEGER b) {
    	return a + b;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    实际上,在预处理阶段,将字符串 INTEGER 替换成 int,然后再对文件进行编译,编译的实质内容是:

    int sum_(int a, int b) {
    	return a + b;
    }
    
    • 1
    • 2
    • 3

    通过运行下面这个例子,可以帮助你更好理解

    #include
    #define SUM(a,b) a+b
    using namespace std;
    int main(){
    	int a=2,b=3;
    	int c=a*SUM(a,b)*b;//直接替换 c=a*a+b*b
    	cout<<c;//13 并不是30
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.3 if语句

    ​ if处理语句可以帮助我们包含或者排除基于条件的代码。

    #if 1
    int sum_(int a, int b) {
    	return a + b;
    }
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5

    因为条件为 1,所以编译器会编译 #if 与 #endif 直接的语句,编译的实质内容是:

    int sum_(int a, int b) {
    	return a + b;
    }
    
    • 1
    • 2
    • 3

    如果if条件为0 则不会编译其中的内容

    2.4 progra语句

    所有 预处理 其中, #pragma 应该最复杂了。
    它的作用是设定 编译器 的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。这里就不进行过多的介绍。有兴趣的可以自己了解。

  • 相关阅读:
    深度解析Shopee虾皮高效选品逻辑方法
    Elasticsearch内存分析
    ORACLE数据库前导0的问题
    计算机毕业设计django基于python精品课程在线学习系统(源码+系统+mysql数据库+Lw文档)
    提取当前文件夹下多文件夹中的数据
    c==ubuntu debug c
    java毕业设计阿博图书馆管理系统mybatis+源码+调试部署+系统+数据库+lw
    认真研究ConcurrentHashMap中的元素统计策略
    Jenkins-CentOS安装jenkins
    C语言入门(五)分支结构
  • 原文地址:https://blog.csdn.net/mitongxue/article/details/128053925