zoukankan      html  css  js  c++  java
  • c语言之带参数的宏定义

    1.带参数的宏定义中,宏名和新参表之间不能有空格,

    2.在带参数的宏定义中,形参参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有具体值,要用它去代换形参,因此必须作类型说明。

    #include<stdio.h>
    #include<iostream>
    #define MAX(a,b) (a>b)?a:b
    
    int main() {
        int x, y, max;
        x = 2;
        y = 3;
        max = MAX(x,y);
        printf("%d
    ", max);
        system("pause");
        return 0;
    }

    3.在宏定义中的形参是标识符,而宏调用中实参可以是表达式。

    4.在宏定义中,字符串内的形参通常要用括号括起来以避免出错。

    5.带参的宏和代餐函数类似,但本质不同,除此之外,把同一表达式用函数处理和用宏处理两者的结果有可能不同。

    普通函数:

    #include<stdio.h>
    #include<iostream>
    
    int SQ(int y) {
        return ((y) * (y));
    }
    int main() {
        int i = 1;
        int SQ(int y);
        while (i <= 5) {
            printf("%d ", SQ(i++));
        }
        printf("
    ");
        system("pause");
        return 0;
    }

    输出:

    宏定义:

    #include<stdio.h>
    #include<iostream>
    #define SQ(y) (y)*(y)
    
    int main() {
        int i = 1;
        while (i <= 5) {
            printf("%d ", SQ(i++));
        }
        printf("
    ");
        system("pause");
        return 0;
    }

    输出:

    为什么结果不同呢?这是因为普通函数调用时,实参传给形参的是值,而在宏定义时,要用表达式进行替换,即(i++)*(i++),所以I++会被执行两次。

    6.宏定义也可以用来定义多个语句,在宏调用时,把这些语句又代换到源程序内。

    #include<stdio.h>
    #include<iostream>
    #define STR(s1,s2,s3,s4) strcat(strcat(strcat(s4,s3),s2),s1)
    
    int main() {
        char str4[] = "ni ";
        char str3[] = "hao ";
        char str2[] = "a ";
        char str1[] = "!!! ";
        printf("%s
    ", STR(str1, str2, str3, str4));
        system("pause");
        return 0;
    }
  • 相关阅读:
    nginx一键安装脚本
    nginx动静分离之后,设置默认主页
    日志备份
    cc高防主机部署
    原型和原型链
    Git&Github分支
    Git&Github基础
    传输层协议TCP&UDP
    本地库与远程库交互
    SVG
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12128751.html
Copyright © 2011-2022 走看看