zoukankan      html  css  js  c++  java
  • 预处理之宏定义

    还记得C++预处理的三种形式吗?条件编译、文件包含、宏定义。今天来总结一下宏定义。

    宏定义(或者宏替换、宏代换),包含两种用法,含参和不含参,其中含参类似函数。

    #define 宏名 字符串

    #define 宏名(参数列表) 字符串

    注意宏名的命名遵循标识符的命名规则。

    定义一个宏后,编译器会在预编译时将宏名代换,这个过程称为宏展开。

    至于宏定义的好处就不多说了,方便修改、增加程序可读性blablabla,书上自己看QwQ

    宏的使用包括含参和不含参两种用法,在此列出它们在使用的时候的一些注意点。

    1、宏名大写;

    2、因为宏展开在预处理的时候进行,因此编译的时候不会检查宏的语法,即使有错误也能通过编译;

    3、定义末尾不加分号;

    4、宏定义通常在文件开头,之后的程序都为其作用域;

    5、#undef用于终止宏定义的作用域;

    6、宏定义可以嵌套;

    7、如果宏名在" "中,则被处理为字符而非宏,因此不会被替换;

    8、宏定义不占用内存;

    9、宏展开不占运行时间,占用编译时间,而函数调用占用运行时间;

    10、宏展开只单纯进行替换,要注意替换后的计算顺序,必要时在宏定义时加上括号;

    有以下代码:

     1 #include <iostream>
     2 #define S(a,b) a*b
     3 #define P(r) r*r
     4 using namespace std; 
     5 int main(){
     6     cout<<S(2,8)<<endl;        //输出16 
     7     cout<<S(2+3,8)<<endl;    //输出26,替换后为(2+3*8) 
     8     cout<<P(3)<<endl;        //输出9 
     9     cout<<P(3+5)<<endl;        //输出23,替换后为(3+5*3+5) 
    10     return 0; 
    11 } 

    顺便提一下条件编译

    #if                   编译预处理中的条件命令,相当于C语法中的if语句
    #ifdef              判断某个宏是否被定义,若已定义,执行随后的语句
    #ifndef            与#ifdef相反,判断某个宏是否未被定义
    #elif                若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,相当于C语法中的else-if
    #else              与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else
    #endif             #if, #ifdef, #ifndef这些条件命令的结束标志.

    用的比较多的还是#ifdef,通常紧跟着#endif

    表示如果#ifdef后的宏名如果被定义了,便执行#ifdef#endif之前的语句。

  • 相关阅读:
    第六次作业
    第五次作业
    第四次作业
    第三次作业
    第二次作业 计科一班程晨
    第一次作业 计科一班程晨
    第七次作业
    第五次作业
    第四次作业
    第三次作业
  • 原文地址:https://www.cnblogs.com/luoyang0515/p/10246580.html
Copyright © 2011-2022 走看看