首页 > 其他分享 >宏的用法1

宏的用法1

时间:2024-09-03 14:38:29浏览次数:5  
标签:__ VA int ARGS 用法 printf define

#include <stdio.h>
#include <math.h>
/*
*从技术角度讲,可以把宏的替换体看做是记号(token)型字符串,而不是字符型字符串。
*C预处理器记号是宏定义的替换体中单独的“词”。用空白把这些词分开
*如:
*define FOUR 2*2
*该宏定义有一个记号:2*2序列
*但是下面的宏定义:
*define SIX 2 * 3
*有3个记号:2、*、3
*在实际应用中一些C编译器把宏替换体视作字符串而不是记号
*/

// #define PSQR(X) printf("The square of #X is %d.\n", ((X) * (X))); 错误的方式
// 1. #作为一个预处理运算法。如果x是一个宏形参,#x就是转换为字符串"x"的形参名
#define PSQR(X) printf("The square of " #X " is %d.\n", ((X) * (X)));

// 2. ##运算符用于类宏函数宏的替换部分。##运算符把两个记号组合成一个记号
// XNMAE(3)将展开为x4
#define XNAME(n) x##n
#define PRINT_XN(n) printf("x" #n " = %d\n", x ## n);

// 3. 变参宏:...和__VA_ARGS__
// 通过把宏参数列表最后的参数写成省略号来实现
// __VA_ARGS__可用在替换部分中,代表省略号代表什么,例如
#define PR(...) printf(__VA_ARGS__)
#define PR2(X, ...) printf("Message " #X ":"  __VA_ARGS__)

int main(){
	printf("1. #\n");
	PSQR(8);
	PSQR(2+4);
	printf("2. ##\n");
	int XNAME(1) = 14;/*等价于int x1 = 14*/
	int XNAME(2) = 20;/*等价于int x2 = 20*/
	int x3 = 30;
	PRINT_XN(1);
	PRINT_XN(2);
	PRINT_XN(3);
	printf("3. __VA_ARGS\n");
	//__VA_ARGS__展开为1个参数:HowDy“”
	PR("HowDy");
	// __VA_ARGS__展开为3个参数:"weight = %d, shipping = $%.2f\n"、wt、sp

	int wt =100;
	float sp = 1.3f;
	PR(", weight = %d, shipping = $%.2f\n", wt, sp);
	double x = 48;
	double y;
	y = sqrt(x);
	PR2(1, "x=%g\n", x);
	PR2(2, "x=%.2f, y=%.4f\n", x, y);
	return 0;
}
// 1. #
// The square of 8 is 64.
// The square of 2+4 is 36.
// 2. ##
// x1 = 14
// x2 = 20
// x3 = 30
// 3. __VA_ARGS
// HowDy, weight = 100, shipping = $1.30
// Message 1:x=48
// Message 2:x=48.00, y=6.9282

标签:__,VA,int,ARGS,用法,printf,define
From: https://www.cnblogs.com/bai7/p/18394521

相关文章

  • vue3 pinia 的基本用法
    ‌Pinia是Vue3的状态管理器,用于跨组件或页面共享状态。以下是使用Pinia的基本步骤:‌安装Pinia‌:首先,你需要在项目中安装Pinia。你可以使用npm或yarn进行安装。例如,使用npm,你可以运行 npminstallpinia 命令来安装Pinia。‌创建Store‌:在Vue3中,你可以使用......
  • 前端宝典二十五:vue2高阶用法mixin、transition、slot
    本文主要探讨vue2中几个高阶的用法:mixin、transition、slot一、mixin在Vue中,mixin(混入)是一种用于在多个组件之间共享代码的机制。它允许你定义可重用的选项对象,并将其混入到不同的组件中。1、使用方法创建一个混入对象:constmyMixin={data(){return{......
  • opencv学习:基础用法和图像添加边界框设置
    1.opencv基础用法1.从文件加载图像a=cv2.imread("1.jpg")b=cv2.imread("2.jpg")2.从文件读取视频video=cv2.VideoCapture("1.mp4")3.读摄像头cv2.VideoCapture(0)4.保存图片cv2.imwrite(r"1_gray.jpg",b)5.展示图片cv2.imshow("shuiju",a)6.释......
  • threejs中OrbitControls的用法
    OrbitControls是Three.js库中一个非常流行的相机控制组件,它允许用户通过鼠标(或触控设备)来旋转、缩放和平移场景中的相机,从而从不同的角度和距离观察场景。下面是如何在Three.js中使用OrbitControls的方法:1.引入OrbitControls首先需要从Three.js的CDN或本地路径中引入O......
  • C++中namespace的用法
    我们在现实的项目开发中一般会有着大量的代码,而且代码都是多人编写的,也许一个项目会有10个功能,每一个人都要完成一个功能。但是敲过代码的都知道,一般在编写程序的时候如果多人没有实现约定去完成,那就会出现代码冲突的情况,那么,为了解决这样的冲突,我们C++中使用了命名空间namesp......
  • Prop效验与Prop默认值用法及循环遍历数组
    Prop效验与使用在HBuilderX里面你把组件传过去,向之前的那样的写法是没有默认值的,写了才有值,否则为空,所以我们可以用另一种方法,写法如下虽然这样写了但是不是完全体的,我们可以给他定个默认值和类型,就像那个String一样,可以约束对象只能是这个的类型这样子另一个页面......
  • computed计算属性及方法对比和循环遍历统计以及watch和watchEect监听的用法
    1.computed计算属性及方法对比1.了解computed计算属性和用法在我们的一些应用中可以看的应用会给我们提供一些计算类的功能比如取名,它会给你提供两个输入框,然后在你给这两个输入框输入值的时候会在下方生成你输入这个两个值的结合值,就比如你先输入了一个姓氏,然后输入一个名,下......
  • 【c++实用】CMakeLists 基本用法(一)
    指令解释cmake_minimum_required(VERSION3.24):指令指定了所需的最低CMake版本a.作用:确保在执行CMake配置时,使用的CMake版本不低于3.24。如果安装的CMake版本低于指定的版本,CMake将会输出错误信息,并拒绝继续执行后续命令b.兼容性:有助于确保项目构建脚......
  • 【C#】一个喜欢用Python的菜狗在尝试Linq之后总结的常见用法以及示例
    1.筛选(Where)筛选集合中的元素。类似python中列表推导式中的if示例int[]numbers={1,2,3,4,5,6};varevenNumbers=numbers.Where(n=>n%2==0);foreach(varnuminevenNumbers){Console.WriteLine(num);}//输出:2,4,6python中的实现[if......
  • Mockito用法总结
    Mockito的是用来做什么的Mockito主要用于单元测试过程中模拟被调用方法的依赖<dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>4.8.0</version><scope>test</scope></depende......