首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何制作可变参数宏

在编程中,可变参数宏是一种允许您使用可变数量的参数定义宏的技术。这对于编写灵活的代码非常有用,特别是在处理不同数量的参数时。以下是一个简单的示例,展示了如何在C++中使用可变参数宏:

代码语言:cpp
复制
#include<iostream>

// 基本宏定义
#define PRINT_ARGS_1(arg1) std::cout<< arg1<< std::endl;
#define PRINT_ARGS_2(arg1, arg2) std::cout<< arg1 << ", "<< arg2<< std::endl;
#define PRINT_ARGS_3(arg1, arg2, arg3) std::cout<< arg1 << ", "<< arg2 << ", "<< arg3<< std::endl;

// 可变参数宏定义
#define VA_NUM_ARGS_IMPL(_1, _2, _3, N, ...) N
#define VA_NUM_ARGS(...) VA_NUM_ARGS_IMPL(__VA_ARGS__, 3, 2, 1)

#define VA_MACRO_DISPATCHER(macro, ...) VA_MACRO_DISPATCHER_IMPL(macro, VA_NUM_ARGS(__VA_ARGS__))
#define VA_MACRO_DISPATCHER_IMPL(macro, nargs) macro ## nargs

#define PRINT_ARGS(...) VA_MACRO_DISPATCHER(PRINT_ARGS, __VA_ARGS__)(__VA_ARGS__)

int main() {
    PRINT_ARGS(1);
    PRINT_ARGS(1, 2);
    PRINT_ARGS(1, 2, 3);
    return 0;
}

在这个示例中,我们定义了三个宏PRINT_ARGS_1PRINT_ARGS_2PRINT_ARGS_3,分别用于打印1个、2个和3个参数。我们还定义了一个VA_MACRO_DISPATCHER宏,它根据参数的数量选择正确的宏定义。

VA_NUM_ARGS宏用于计算传递给PRINT_ARGS宏的参数数量。VA_MACRO_DISPATCHER_IMPL宏将VA_NUM_ARGS计算出的参数数量附加到PRINT_ARGS宏定义上,从而选择正确的宏定义。

main函数中,我们使用PRINT_ARGS宏打印不同数量的参数。这个示例将输出以下内容:

代码语言:txt
复制
1
1, 2
1, 2, 3

请注意,这个示例仅适用于C++编译器。其他编程语言可能需要不同的实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

变参函数和可变参数

void) { int num = 0; my_printf("I am litao, I have %d car\n", num); return 0; } Part2二、可变参数的设计与实现...61.什么是可变参数 在上面的教程中,我们学会了变参函数的定义和使用,基本套路就是使用 va_list 、 va_start 、 va_end 等,去解析那些可变参数列表我们找到这些参数的存储地址后...其实,C99 标准已经支持了这个特性,但是其它的编译器不太给力,对 C99 标准的支持 不是很好,只有 GNU C 支持这个功能,所以有时候我们也把这个可变参数看作是 GNU C 的一个语法扩展。...可变参数使用 C99 标准新增加的一个 VA_ARGS 预定义标识符来表示前面的变参列表,而不是像变参函数一样,使用 va_list 、va_start 、 va_end 这些去解析变参列表。...Part3三、利用变参函数和可变参数实现自己的代码模块 91.实现函数重载 前边我们定义过CONNECT2, CONNECT3的,如果我们要粘连的字符串数量不同,比如,2个、4个、5个……n个,我们就要编写对应的版本

1.9K20
  • cc++:提取可变参数__VA_ARGS__中偶数位置参数

    https://blog.csdn.net/10km/article/details/80769615 考虑一个可变参数__VA_ARGS__中奇数位代表参数类型,偶数位代表参数名,想要提取...__VA_ARGS__中所有的偶数位的参数名,该怎么实现呢?...利用上一篇博客《c/c++:计算可变参数 __VA_ARGS__ 的参数个数》的成果可以获取__VA_ARGS__中参数的个数。...在这个基础上添加一系列定义就可以实现,下面是完整代码及测试用例, gcc下测试通过: // 计算 __VA_ARGS__ 参数个数,最大支持64个参数 #define FL_ARG_COUNT(......FL_ARG2(t,v),FL_ARG62(__VA_ARGS__) // 提取动态参数表中的偶数位参数,比如 一个参数序列:1,2,3,4,返回 2,4,最大支持64个参数 // 参数个数为奇数时会导致编译报错

    1.3K10

    Java 可变参数

    Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理。注意:可变参数必须位于最后一项。...当可变参数个数多余一个时,必将有一个不是最后一项,所以只支持有一个可变参数。...因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项。...可变参数的特点: (1)只能出现在参数列表的最后;  (2)位于变量类型和变量名之间,前后有无空格都可以; (3)调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中一数组的形式访问可变参数

    1.6K100

    利用C可变参数定义来实现自己的日志系统

    2.可变参数 大家都知道,printf函数就是通过可变参数机制来实现的。 可变参数可以这样定义和使用: (1)不带参数名 ? (2)带参数名 ?...第20行代码用 __VA_ARGS__ 来代表定义参数中的三个点(...),也就是可变参数。 再来说说“##”。...如果调用:debug2("hello"); 这里调用时,在format后面没有传入任何参数,那么就会编译错误,因为在替换之后变成了 printf("hello",),第一个参数之后多了一个逗号,因此报错...; 这样就没有问题,因为debug3中在可变参数__VA_ARGS__的前面有“##”,当编译器发现没有传入参数时,会自动把format后面的逗号去掉,所以编译OK。...3.定义中的#和## #的作用就是在预处理的时候,把参数进行“字符串化”,例如: ? ##的作用就是在预处理的时候,把两个参数进行“粘合”,例如: ?

    1.5K20

    可变数据软件如何导入数据批量制作可变条形码

    可变数据软件可以在制作打印条形码、文字、数字的时候实现数据可变,在可变数据软件中实现数据可变有很多种方法,最常用的就是数据库导入的方法,今天小编简单介绍下可变数据软件中如何通过数库导入条形码数据批量制作可变条形码...首先,通过数据库把可变条形码数据批量导入可变数据软件中,可变数据软件支持TXT、Excel表、Access、SQL Server等多种数据库导入的方式。选择相应的数据源导入数据。...在可变数据软件中制作一个条形码,打开条形码的“图形属性”-“数据源”修改可变条形码数据,选择“数据库导入”,下面选择相应的条形码数据字段。...打印预览查看批量制作可变条形码,通过翻页可以看出,通过数据库导入的所有条形码数据都批量制作成了可变条形码。...以上就是在可变数据软件中通过数据库导入条形码数据批量制作可变条形码的步骤,可变条形码的制作非常简单,导入多少条形码数据就可以批量制作多少可变条形码,而且可变条形码制作完成之后可以在可变数据软件中直接连接打印机打印

    63320

    c++ 可变参数 默认类型升提升 可变参数陷阱

    可变参数传递在传递过程中有一个“默认实际参数提升”(参考https://blog.csdn.net/jchnlau/article/details/9466435)的过程 在函数fun中,不定参数中的第...3个本来是传递float,但是在这里如果设置解析成float却导致第三个及第三个参数后的所有参数解析都是错误的,如果将第三个参数改为double类型来解析,发现后面的能全部解析正确。 ...可以参看 "stdarg.h" 中的va_start 和va_arg,va_end在x86的情况下的定义 _INTSIZEOF(n) 作用是将字节数不是sizeof(int)整数倍的类型占用空间改为sizeof...所以数据在作为不定参数传递到fun函数中时,已经被编译器做过了数据类型提升处理。及char、short,int变成了int,float 变成了double。 ...对于vprintf,第二个参数的数据类型要求比较严格。如果希望解析成功,数据类型必须是由int 和double等类型来组装的数据。

    76240

    可变参数的函数

    什么是可变参数函数 C语言允许定义参数数量可变的函数,这称为可变参数函数(variadic function)。这种函数需要固定数量的强制参数,后面是数量可变的可选参数。...其中,强制参数必须至少一个,可选参数数量可变,类型可变,可选参数的数量由强制参数的值决定。 C 语言中最常用的可变参数函数例子是 printf()和 scanf()。...,返回的参数就是当前va_list指针所指的可变参数,所以类型也跟传入的可变参数类型相同。...访问完一个可变参数会后移指向下一个可变参数 va_end 当不再需要使用参数指针时,必须调用 va_end。...如果想使用 va_start 或者 va_copy 来重新初始化一个之前用过的参数指针,也必须先调用 va_end。

    22410

    可变参数(cc++)

    那么这些函数是如何实现的呢? 一、C语言版本 在 C 中,可变参数通过 头文件中的来处理。最常用的是 va_list、va_start、va_arg 和 va_end。...以下是这些的简要说明: va_list:用于声明一个可变参数列表的类型。 其实va_list就是一个char*类型,但具体实现取决于编译器和平台。...int main() { std::cout<<addsum(5, 1, 2, 3, 4, 5); return 0; } 在 C 语言中,如果你使用了 va_start 来初始化可变参数列表...二、C++的实现方法 2.1数据包 在 C++ 中,也可以使用可变参数模板来实现类似的功能,这种技术更加灵活,并且不需要使用。...C++11 引入了新的语法和标准库支持,使得可变参数模板更加易用和安全。 c++在c++11中提出了可变参数模板的概念,所谓可变参数模板就是一个接受可变数目参数模板的函数或模板类。

    64010

    CC++开发基础——可变参数可变参数模板

    一,可变参数 1.基础概念 可变参数在C语言和C++语言编程中都有应用。 可变参数的含义是:在函数传参的时候,参数的数量、类型都是可变的,不确定的。...在C语言中,应用到可变参数的是可变参数函数和可变参数。...2.如果可变参数参数类型不同,可以使用可变参数模板。 C语言中,在定义可变参数函数时,使用省略号"..."表示参数可变的。...2.可变参数相关的定义 在C语言中,一般需要借助相关的定义来实现可变参数,常见的定义如下: va_arg:每一次调用va_arg会获取当前的参数,并自动更新指向下一个可变参数。...va_start:获得可变参数列表的第一个参数,开始使用可变参数列表。 va_end:结束对可变函数列表的遍历,释放va_list。 va_list:存储可变参数列表的具体信息。

    57750

    Java 可变参数

    Java1.5增加了新特性: 可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理。 注意:可变参数必须位于最后一项。...当可变参数个数多余一个时,必将有一个不是最后一项,所以只支持有一个可变参数。...因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项。...可变参数的特点: (1)、只能出现在参数列表的最后;  (2)、...位于变量类型和变量名之间,前后有无空格都可以; (3)、调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中一数组的形式访问可变参数

    67730

    C++可变参数

    Java中的可变参数其实就是数组,对C++的可变参数比较好奇,所以上网查了资料,了解下! 首先,C++中可变参数的定义: void function(...)...该函数的作用是将第一个参数所指向的可变参数转换成由第二个参数所指定的类型的数据,并将该数据作为函数va_arg()的返回值,同时使va_arg()的第一个参数指向下一个可变参数,为取下一个可变参数做好准备...使用可变参数的函数要注意一下几点: (1)定义函数时,固定参数部分放在参数表的前面,省略号“...”表示可变参数。...(2)必须使用函数va_start()来初始化可变参数,为取第一个可变参数做好准备工作;使用函数va_arg()依次取各个可变参数值;最后用函数va_end()做好结束工作,以便能正确地返回。...(3)在调用参数个数可变的函数时,必定有一个参数指明可变参数的个数或总的参数个数。

    1.8K20

    C语言有参数定义与无参数定义

    C语言中定义分两种,无参的和有参的 1.无参数        无参数定义的一般形式为: #define name value//name是你起的名字,就跟起函数名一样,value是你要给这个名字赋予什么值...2.有参数        有参数的定义形式一般为: #define name(参数1,参数2,....) sentence//sentencen表示语句 //示例: #define max(a,b...进行定义时不会考虑参数的类型。        3. 参数的使用会使具有同一作用的代码块在目标文件中存在多个副本,即会增长目标文件的大小。        4....函数的调用会牵扯到参数的传递,压栈/出栈操作,速度相对较慢。        7. 函数的参数存在传值和传地址(指针)的问题,参数不存在。        3....加这层的用意是把所有参数在中间曾全部展开。

    2.8K30

    过程(五)可选参数可变参数

    大家好,上节介绍了过程传递参数时,形参与实参结合的两种方式,传地址和传值。本节将介绍可选参数可变参数。...对于可选参数可变参数,都是在创在过程时可以设置的,概念不易理解,下面还是简单介绍,在通过示例来介绍。...---- 二、可变参数 上面介绍可选参数时,可以发现在定义过程时,不管是固定参数还是可选参数,都已经制定了参数的个数,那么在VBA中还可以定义可变参数,即参数的个数在定义时时未知的。...在定义过程的参数表时,在最后一个参数前面加上ParamArray关键字,过程将接受任意个数的参数。 下面通过可变参数编写求和函数的示例来介绍。...---- 本节介绍了可选参数可变参数的知识,后期会介绍Function(函数)过程,祝大家学习快乐。 ----

    4.7K20
    领券