c语言可变参数与宏定义

宏定义
https://www.cnblogs.com/wzd5230/p/10959032.html
https://www.cnblogs.com/xyang0917/p/4172493.html
https://blog.csdn.net/wukery/article/details/53286348

//...表示可变参数列表
#define LOG(format, args...) fprintf(stdout, format, args)
LOG("%s","123"); //正确
LOG("123");  //错误   展开后,相当与LOG(,"123")

#define LOG(format, args...) fprintf(stdout, format, ##args)
LOG("%s","123"); //正确
LOG("123");  //正确  ##加上后不会进行连接。
##”连接符号的用法,“##”的作用是对token进行连接,上例中format,args都可以看作是token,如果token为空,“##”则不进行连接,所以允许省略可变参数
因为format这个token为空,又因为有##的加持,所以不连接。
//生产环境与测试环境切换操作
#ifdef DEBUG
#define LOG(format, ...) fprintf(stdout, ">> "format"\n", ##__VA_ARGS__)
#else
#define LOG(format, ...)
#endif

可变参数编程
https://www.cnblogs.com/edver/p/8419807.html
https://www.runoob.com/cprogramming/c-variable-arguments.html
https://blog.csdn.net/ericbar/article/details/79558827

原文地址:https://www.cnblogs.com/retry/p/11810818.html

时间: 2024-10-08 21:48:25

c语言可变参数与宏定义的相关文章

C语言可变参数在宏定义中的应用

在C语言的标准库中,printf.scanf.sscanf.sprintf.sscanf这些标准库的输入输出函数,参数都是可变的.在调试程序时,我们可能希望定义一个参数可变的输出函数来记录日志,那么用可变参数的宏是一个不错的选择. 在C99中规定宏也可以像函数一样带可变的参数,如: #define LOG(format, ...) fprintf(stdout, format, __VA_ARGS__) 其中,...表示可变参数列表,__VA_ARGS__在预处理中,会被实际的参数集(实参列表)

C语言:带参数的宏定义

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

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",

C语言可变参数函数实现原理

一.可变参数函数实现原理 C函数调用的栈结构: 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈. 本文地址:http://www.cnblogs.com/archimedes/p/variable-parameter.html,转载请注明源地址. 例如,对于函数: void fun(int a, int b, int c) { int d; ... } 其栈结构为 0x1ffc-->d 0x200

C语言——可变参数

http://blog.chinaunix.net/space.php?uid=25304914&do=blog&id=3066441 一.是什么 我们学习C语言时最经常使用printf()函数,但我们很少了解其原型.其实printf()的参数就是可变参数,想想看,我们可以利用它打印出各种类型的数据.下面我们来看看它的原型: int printf( const char* format, ...); 它的第一个参数是format,属于固定参数,后面跟的参数的个数和类型都是可变的(用三个点&

c语言可变参数函数

c语言支持可变参数函数.这里的可变指,函数的参数个数可变. 其原理是,一般情况下,函数参数传递时,其压栈顺序是从右向左,栈在虚拟内存中的增长方向是从上往下.所以,对于一个函数调用 func(int a, int b, int c); 如果知道了参数a的地址,那么,可以推导出b,c的地址 #include <stdio.h> void test(int a, int b, int c) { printf("%p, %p, %p\n", &a, &b, &

C语言 预处理二(宏定义--#define)

//#define 宏定义(宏定义一般大写) //知识点一-->#define的作用域:从#define开始,从上往下,如果遇到#undef就到#undef处结束,如果没有就是作用于当前整个文件 #include<stdio.h> #include<stdlib.h> //知识点二-->宏定义作用 //宏定义作用1:起到替换作用,可以定义常量 #define X 10 //宏定义作用2:替换代码的任意部分(一般用于易语言,或者加密代码) #define 水乃万物之源 m

可变参数的宏

参考自: http://www.cnblogs.com/lixiaohui-ambition/archive/2012/08/21/2649052.html http://blog.csdn.net/aobai219/article/details/6092292 http://www.cnblogs.com/MarvinGeng/archive/2012/07/19/2598923.html 感谢lizezheng.TONGGETONGGE.MarvinGeng的指引! 可变参数的宏: 1.

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

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