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\n", 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("\n");
    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("\n");
    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\n", STR(str1, str2, str3, str4));
    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/xiximayou/p/12128751.html

时间: 2024-08-06 17:03:50

c语言之带参数的宏定义的相关文章

C语言:带参数的宏定义

宏名的命名规范 1.全部大写有多个单词中间使用下划线隔开(常用) 2.以k开头的驼峰标识(不常用) 带参数的宏定义:把出现宏名地方都会把宏名后面小括号中的参数代入到宏后面的表达式中,然后进行替换 格式:#define 宏名(参数列表)  表达式 注意点:1.参数列表中没有类型 2.宏名与括号之间一定不要加空格 带参数的宏与函数的区别 1.函数有一个调用过程,会开辟新存储空间,需要花费一些开销的 2.宏仅仅是做一个替换的操作 使用场景: 1.当计算比较简单,参数比较少的时候使用宏,宏提高运算效率

不带参数的宏定义与带参数的宏定义

宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义.文件包含.条件编译 1.不带参数的宏定义: 宏定义又称为宏代换.宏替换,简称“宏”. 格式: #define 标识符 字符串 其中的标识符就是所谓的符号常量,也称为“宏名”. 预处理(预编译)工作也叫做宏展开:将宏名替换为字符串. 掌握"宏"概念的关键是“换”.一切以换为前提.做任何事情之前先要换,准确理解之前就要“换”. 即在对相关命令或语句的含义和功能作具体分析之前就要换: 例: #define PI 3.1415

编程题:带参数的宏定义来实现,求圆的周长和面积。

#include<stdio.h> #define PI 3.14159 #define L(r) 2*PI*(r) #define S(r) PI*(r)*(r) void main() { float radius,circle,area; scanf("%f",&radius); circle=L(radius); area=S(radius); printf("radius:%f\tcircle:%f\tarea:%f\n", radiu

C语言中带参数的宏

带参数的宏定义有如下的格式: [#define 指令----带参数的宏] #define 标识符(x1,x2,……,xn) 其中  x1,x2,……xn是标志符(宏的参数) 注意:在宏的名字和括号之间必修没有空格. 如果有空格,预处理会认为是在定义一个简单的宏,其中(x1,x2,……,xn)是替换列表的一部分 当预处理器遇到一个带参数的宏,会将定义存储起来以便以后使用.在后面的程序中,如果任何地方出现了标识符(y1,y2……,yn)格式的宏调用(其中y1,y2, ……yn是一些列标记),预处理器

C语言带参数的宏

利用带参数的宏,可以加强封装,简化主体代码.(VC6控制台工程) 1 // 带参数的宏.cpp 2 // 看看带参数的宏是怎么玩的 3 4 //#include "stdafx.h" 注释掉这个头文件,同时在Project——setting——precompiled headers——选择“Not Use Precompiled Header”,能够避免compile出错 5 #include "stdio.h" 6 7 #define prt(cmd) (prin

C语言编程入门——枚举与宏定义

枚举是编程人员自己定义的一种基本数据类型,这种类型的变量只能取枚举中的值,好处就是能够防止变量的错误赋值.用法:enum 类型名{变量1,变量2,变量3,...} C语言中宏定义是定义在程序头部,作预处理用,有无参和有参两种,可以看作是一个过程的调用,与函数调用不一样,不涉及入栈出栈问题,调用速度快.用法:#define 替换名 原名 宏定义示例1: # include <stdio.h> #define DD "%d" //宏定义,在以下书写中可用DD代替"%d

sas宏(3)宏,调试宏,创建带参数的宏,理解符号表(全局宏与局部宏解析),宏条件运算符,在宏中进行运算

宏类似于c中的函数,传入指定参数后执行,并且宏内部可以包含data步程序和条件运算符号. 宏变量只是小小的变量....(by the way作用也很大) 1:宏的基本语法 如何创建一个简单的宏并使用? %macro prtlast; proc print data=&syslast (obs=5); title "Listing of &syslast data set"; run; %mend; %prtlast /*不要加分号,加了有可能出错*/ 宏创建过程中做了什

华摄氏度和摄氏度的转换 华摄氏度转化摄氏度 使用带运算的宏定义

定义: 摄氏度:CELSIUS EQUALS 华氏度:FAHENHEIT EQUALS 彼此间的转换很容易,如下: 将摄氏度转成华氏度:将摄度以氏直接乘以9,除5,再加上32 华氏度转成摄氏度:将华氏度减去32,乘以5再除以9 写成公式: CelEquVal --摄氏度 FahEquVal-- 华氏度 摄氏度转成华氏度: FahEquVal = CelEquVal  * 9 / 5 + 32; 华氏度转成摄氏度: CelEquVal  =(FahEquVal - 32) * 5 / 9; 公式看

带参数的宏替换

带参数的宏替换因各种需求叠加,替换规则很怪异: 1.首先将实参替换形参,并展开宏 2.如果1步展开后,有#或者##,那么停止替换. 3.如果1步展开后,没有#或者##,且参数也是宏,那么继续替换,知道参数没有宏为止. 4.执行完1-3后,第一轮替换结束,再次扫描宏,如果外层还有宏,继续替换. 5.简单说:先用实参代替形参,然后继续替换实参内的宏,发现#或##后停止. 原文地址:https://www.cnblogs.com/litifeng/p/8424078.html