• C++ Tutorials: C++ Language: Other language features: Preprocessor directives


    C++官方参考链接:Preprocessor directives - C++ Tutorials (cplusplus.com)

    预处理器指令
    预处理器指令是包含在程序代码中前面带井号(#)。这些行不是程序语句,而是用于预处理器的指令。预处理器在开始实际编译代码之前检查代码,并在通常语句实际生成任何代码之前解析所有这些指令。
    这些预处理器指令只能跨一行代码扩展。只要找到换行符,预处理器指令就结束。预处理器指令的末尾不需要分号(;)。预处理器指令可以扩展到多行,唯一的方法是在行尾的换行符前加上反斜杠(\)

    宏定义(#define, #undef) 
    要定义预处理器宏,可以使用#define。它的语法是:
    #define identifier replacement
    当预处理程序遇到这个指令时,它会用replacement替换代码中出现的任何的identifier。这个replacement可以是一个表达式、一条语句、一个块或任何东西。预处理器并不完全理解C++,它只是用replacement替换任何的identifier的出现。 
    #define TABLE_SIZE 100
    int table1[TABLE_SIZE];
    int table2[TABLE_SIZE]; 
    在预处理器替换了TABLE_SIZE之后,代码等价于:
    int table1[100];
    int table2[100];
    #define也可以使用形参来定义函数宏:
    #define getmax(a,b) a>b?a:b 
    这将用替换表达式(a>b?a:b)替换跟着两个实参的getmax,但也用它的标识符替换每个实参,就像你所期望如果它是一个函数的那样:
    // function macro
    #include
    using namespace std;

    #define getmax(a,b) ((a)>(b)?(a):(b))

    int main()
    {
      int x=5, y;
      y= getmax(x,2);
      cout << y << endl;
      cout << getmax(7,x) << endl;
      return 0;
    }

    定义的宏不受块结构的影响。宏持续到使用#undef预处理器指令未定义为止
    #define TABLE_SIZE 100
    int table1[TABLE_SIZE];
    #undef TABLE_SIZE
    #define TABLE_SIZE 200
    int table2[TABLE_SIZE];
    这将生成如下代码:
    int table1[100];
    int table2[200];
    函数宏定义在替换序列中接受两个特殊操作符(#和##): 
    操作符#后面跟一个形参名,被一个包含传入实参的

  • 相关阅读:
    kubeflow 1.6.1 单机搭建
    SpringBoot+Mybatis实现代码获取建表语句并实现动态建表
    修炼k8s+flink+hdfs+dlink(七:flinkcdc)
    tolua源码分析(七)带out参数的C#函数
    PAT(乙级)1091 N-自守数(JAVA)
    web漏洞-PHP反序列化
    优维低代码:Storyboard Functions 微应用函数
    WCF异常System.ServiceModel.ProtocolException问题处理
    spark 任务优化
    C陷阱与缺陷 第7章 可移植性缺陷 7.9 大小写转换
  • 原文地址:https://blog.csdn.net/weixin_40186813/article/details/126916322