C宏定义不定参数

1.#

假如希望在字符串中包含宏参数,ANSI
C允许这样作,在类函数宏的替换部分,#符号用作一个预

处理运算符,它可以把语言符号转化程字符串。例如,如

果x是一个宏参量,那么#x可以把参数名转化成相应的字符串。该过程称为字符串化(stringizing).

#incldue <stdio.h>

#define PSQR(x) printf("the square of" #x "is
%d./n",(x)*(x))

int main(void)
{
    int y =4;

PSQR(y)

PSQR(2+4);

return 0;
}

输出结果:
the square of y is 16.
the square of 2+4 is 36.
第一次调用宏时使用“y”代替#x;第二次调用时用“2+4"代#x。

2.##

##运算符可以使用类函数宏的替换部分。另外,##还可以用于类对象宏的替换部分。这个运算符把两

个语言符号组合成单个语言符号。例如:
#define XNAME(n) x##n

这样宏调用:
XNAME(4)
展开后:
x4
程序:
#include <stdio.h>
#define
XNAME(n) x##n
#define PXN(n) printf("x"#n" =
%d/n",x##n)
int main(void)
{
    int XNAME(1)=12;//int x1=12;
   
PXN(1);//printf("x1 = %d/n", x1);
    return 0;
}

3.可变宏 ...和_ _VA_ARGS_ _

实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点)。这样预定义宏_ _VA_ARGS_

_就可以被用在替换部分中,以表示省略号代表什

么。比如:
#define PR(...) printf(_
_VA_ARGS_ _)  不管 _ _VA_ARGS_ _是什么都可以正确使用宏

#define PR(...) printf(_ _VA_ARGS_ _)

PR("hello");-->printf("hello");

PR("weight = %d, shipping = $.2f",wt,sp);

-->printf("weight = %d, shipping =
$.2f",wt,sp);

省略号只能代替最后面的宏参数。#define W(x,...,y)错误, VC6.0不支持 VS2005支持

时间: 2024-10-12 00:29:26

C宏定义不定参数的相关文章

C语言利用va_list、va_start、va_end、va_arg宏定义可变参数的函数

在定义可变参数的函数之前,先来理解一下函数参数的传递原理: 1.函数参数是以栈这种数据结构来存取的,在函数参数列表中,从右至左依次入栈. 2.参数的内存存放格式:参数的内存地址存放在内存的堆栈段中,在执行函数的时候,从最后一个(最右边)参数开始入栈.因此栈底高地址,栈顶低地址,举个例子说明一下: void test(int a, float b, char c); 那么,在调用test函数的时候,实参char c先进栈,然后是float b,最后才是int a,因此在内存中变量的存放次序是c->

宏定义中参数使用

1. 宏传递变长参数: 最近用C语言写一个程序,经常调用shell或者其他命令,代码中多处出现如下代码: char script_cmd[CMD_MAX_LEN + 1] = {'\0'}; memset(script_cmd, 0, sizeof(script_cmd)); sprintf(script_cmd, "cmd %s %s", param1, param2); system(script_cmd); 每调用一次就是三行代码,看着也十分不爽.偶然间学会通过宏传递参数,代码瞬

(一)预定义宏、__func__、_Pragma、变长参数宏定义以及__VA_ARGS__

作为第一篇,首先要说一下C++11与C99的兼容性. C++11将 对以下这些C99特性的支持 都纳入新标准中: 1) C99中的预定义宏 2) __func__预定义标识符 3) _Pragma操作符 4) 不定参数宏定义以及__VA_ARGS__ 5) 宽窄字符串连接 这些特性并不像语法规则一样常用,并且有的C++编译器实现也都先于标准地将这些特性实现,因此可能大多数程序员没有发现这些不兼容.但将这些C99的特性在C++11中标准化无疑可以更广泛地保证两者的兼容性.我们来分别看一下. 这次,

C++11 变长参数的宏定义以及__VA_ARGS__

[1]变长参数的宏定义以及__VA_ARGS__ 在C99标准中,我们就已经可以使用变长参数的宏定义. 变长参数的宏定义是个神马?就是在宏定义的参数列表中最后一个参数为省略号. 而现在C++ 11中,使用预定义宏__VA_ARGS__可以在宏定义的实现部分替换省略号所代表的字符串. 原书示例: #include <stdio.h> #define LOG(...) { \ fprintf(stderr, "%s: Line %d:\t", __FILE__, __LINE_

c++使用不定参数

定义不定参数,使用的宏有: va_start(ap, arg)  初始化一个va_list的变量ap va_arg(ap, type)  获取下一个type类型的参数 va_end(ap)  结束使用ap #include <stdarg.h> #include <stdio.h> int sum(int cnt, ...) { int sum = 0; va_list ap; va_start(ap, cnt); for (int i = 0; i < cnt; ++i)

宏定义中的#,##,...,do{}while(0),__VA_ARGS__

宏定义中的#,## 1.在一个预处理器宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组 #define syslog(a) fprintf(stderr,"Warning: " #a"\n"); 2.简单的说,"## "是一种分隔连接方式,它的作用是先分隔,然后进行强制连接 举列 -- 试比较下述几个宏定义的区别 #define A1(name, type)  type name_##type##_type 或 #define A

c 预处理的宏定义

概念 以“#”号开头的都是预处理命令 例如 #include <stdio.h>宏定义 宏定义无参数的宏名后不带参数# 表示这是一条预处理命令, define 为宏定义命令.“标识符”为所定义的宏名.“字符串”可以是常数,表达式.格式串等 举例: #define PI 3.1415926 作用: 就是用指定标识符PI来代替数3.1415926 对源程序作编译时, 将先由预处理程序进行宏代换, 即用3.1415926表达式去置换所有的宏名PI, 然后编译 #include <stdio.h

[Python进阶]001.不定参数

不定参数 介绍 元组参数 字典参数 混合 介绍 不定参数用 * 和 ** 定义 不定参数必须在其他所有参数之后 例子:os.path.join 方法就可以写入不定数量的参数 元组参数 定义:*args 以*作为参数前缀 会将传入的多个参数作为一个元组传入 代码 def fun(*args): for i in args: print i fun('a', 'b', 'c', 'd') def fun2(arg1, arg2, *args): # 带2个固定参数 print 'arg1:', ar

iOS开发分分钟搞定C语言 —— 宏定义和关键字

一.宏定义 概念:宏定义实质是一个预编译指令,在程序未运行之前将某些指令付给相应的变量.一般情况预处理指令都是以#号开头的,所以宏定义也是以#开发,关键字为#define(定义宏定义),#undef(结束宏定义). 定义格式及作用域 一般宏定义都定义在程序的首段: #define 宏名 值. 宏定义的作用域:从开始定义的那行起,一直到文件末尾,虽然默认情况下宏定义的作用域是从定义的那一行开始, 一直到文件末尾.但是我们也可以通过对应的关键字#under提前结束宏定义的作用域. 宏定义规范 一般情