• C++宏的作用


    四种预编译命令:头文件包含,条件编译,宏替换和布局控制。

    1.头文件包含

    #include

    文件分别用两种形式包含,一种将文件用“”包含,另一种用<>包含。

    两种包含方式的不同之处在于,它们的查找策略不同。

    #include<>包含的是库文件,会去系统库所在的文件目录下查找。

    #include" "包含的是自己写的头文件,会先在所在的源文件的目录下查找,如果该头文件未找到,编译器就会像查找库函数一样再去系统库所在的文件下查找。

     2.宏替换

    1.宏替换的几种用法

    a.定义常量

    如#define cdz 50,则将在程序中搜索cdz并替换为50。但是注意,搜索的cdz只能是单独的单词,不能嵌入在单词中。如下:

    1. #include<iostream>
    2. #define cdz 50
    3. int main
    4. {
    5. std::cout<<fcdzk<<std::endl;
    6. }

    b.定义语句

    如:#define PFINT printf("hello world!\n");,将会在程序中搜索PFINT的单词,并换成后面的语句实行,将输出hello world!并换行。

    c.定义函数

    如:#define MAX(a, b) ((a)>(b)?(a):(b))

    d.取消宏定义

    如:#undef add,将会将之前的add的宏定义取消。

    2.宏的特殊符号

    a.#字符串化

    #会将后面的变量转为一个字符串

    1. #define PRT(exp) printf("%s\n",#exp);
    2. #include
    3. int main()
    4. {
    5. PRT(FRI DAY)
    6. return 0;
    7. }

    b.##连接

    会将前后的两个符号连接在一起。如下:

    1. #include<stdio.h>
    2. #define ADD(value1, value2) num1##value2
    3. int main()
    4. {
    5. int a = ADD(114, 514);
    6. printf("%d \n", a);
    7. return 0;
    8. }

    其他还有奇奇怪怪的各种宏,但没必要再去全面的了解,遇到之后百度即可。

    3.条件编译

    1.预定义符号

    1. __FILE__ // 进行编译的源文件
    2. __LINE__ // 文件当前的行号
    3. __DATE__ // 文件被编译的日期
    4. __TIME__ // 文件被编译的时间
    5. __STDC__ // 如果编译器遵循 ANSI C,其值为1 ,否则未定义 ;

    这些符号是c语言内置。如:

    1. #include<iostream>
    2. using namespace std;
    3. int main()
    4. {
    5. cout<<__TIME__<<endl;
    6. return 0;
    7. }

    2.包含头文件

    1.#ifndef

    1. #ifndef _MYHEADER_H
    2. #define _MYHEADER_H
    3. //头文件内容
    4. #endif

    第一次访问该头文件,会定义MYHEADER_H。然后才会执行头文件的内容。

    之后在访问该文件,发现MYHEADER_H已经定义。因此头文件的内容将不再执行。

    这种在多次包含头文件可能会用到,例如A头文件包含B头文件,C头文件包含B头文件,

    如果不加上面的内容,B头文件将被包含两次,将会发生错误。

    2.#progma once

    目的是起到和#ifdef防止重复包含文件一样的作用。但入手点是物理文件下手,#progma once保证

    同一物理文件不会被重复包含。

    但如果同一头文件有多份拷贝,则不能保证不被重复包含。

    但较#ifdef防止重复包含文件,带来的好处是,不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。

    3.包含内容

    例如C++文件都会自动执行#define __cplusplus,因此我们想要仅在C++文件执行下面的内容,而不是C文件,就会像下面那样做:

    1. #ifdef __cplusplus
    2. //内容
    3. #endif

    4.布局控制

    1. #ifndef UNIX
    2. #error This software requires the UNIX OS.
    3. #endif

    这条指令主要是给出错误信息,上面的这个例子就是,如果没有在UNIX环境下,就会输出This software requires the UNIX OS.然后诱发编译器终止。所以总的来说,这条指令的目的就是在程序崩溃之前能够给出一定的信息。

  • 相关阅读:
    mysql高阶语句
    DDD实战心得
    Spring学习笔记(三十七)——Flyway 数据库版本控制
    MySQL 主要线程
    【Realtek】RTL8198D Dual Image逻辑说明及切换方法
    基于51单片机的可调节占空比四种三种波形发生器proteus仿真
    Flask 学习-32.flask_jwt_extended 自定义装饰器
    云计算-Linux-mv,cat,less,head,tail,rm命令学习
    Android打造专有Hook第四篇,实战增量代码规范检查
    Django部署vue项目报错:Not Found The requested resource was not found on this server.
  • 原文地址:https://blog.csdn.net/cdz2470/article/details/134031555