宏定义中参数使用

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);

每调用一次就是三行代码,看着也十分不爽。偶然间学会通过宏传递参数,代码瞬间简化很多:

#define    EXECUTE_SCRIPT(script_cmd_array, format,args...) \
    memset(script_cmd_array, 0, sizeof(script_cmd_array));     sprintf(script_cmd_array, format, ##args);     system(script_cmd_array);

char script_cmd[CMD_MAX_LEN + 1] = {‘\0‘};
EXECUTE_SCRIPT(script_cmd, "cmd %s %s", param1, param2);

2. 宏中参数当做字符串使用

 1 #define REMOVE_SHMEM(shmid)  2     if (shmid != -1) {  3         if (shmctl(shmid, IPC_RMID, NULL) == -1) {  4             printf("remove %s failed!\n", #shmid);  5         }  6     }
 7
 8 int main (void)
 9 {
10     int myshm = 123;
11
12     REMOVE_SHMEM(myshm);
13 }

输出:

remove myshm failed!

 

原文地址:https://www.cnblogs.com/luoyingcai/p/11142244.html

时间: 2024-10-07 14:10:00

宏定义中参数使用的相关文章

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){   

宏定义中的#,##,...,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

宏定义中##和#的作用

解释1 : 定义中##和#的作用内核中有很多的宏定义,在宏定义define中经常看到两个字符串##和#,这里把它的用法做一下说明:1. ####是一个连接符号,用于把参数连在一起例如:> #define FOO(arg) my##arg则> FOO(abc)相当于 myabc2.#:是"字符串化"的意思.出现在宏定义中的#是把跟在后面的参数转换成一个字符串例如:> #define STRCPY(dst, src) strcpy(dst, #src)则> STRC

#和##在宏定义中使用问题

转自:http://www.linuxidc.com/Linux/2014-06/102925.htm 有一道经典的C语言问题,关于宏定义中#和##符号的使用和宏定义展开问题 程序如下: #include <stdio.h>#define f(a,b) a##b#define g(a)  #a#define h(a) g(a) int main(){        printf("%s\n", h(f(1,2)));        printf("%s\n&quo

define宏定义中的#,##,@#及\符号

define宏定义中的#,##,@#及\符号 在#define中,标准只定义了#和##两种操作.#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串. 1.# (stringizing)字符串化操作符.其作用是:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串.其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前. 如: #define example(instr) printf("the input string is:\t%s\n",#

宏定义中#和##的使用

1. # #的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号 1 #define WARN_IF(EXP) / 2 do{ if (EXP) / 3 fprintf(stderr, "Warning: " #EXP "/n"); } / 4 while(0) 那么实际使用中会出现下面所示的替换过程: 1 WARN_IF (divider == 0); 被替换为 1 do { 2

C宏定义中的连接符&quot;##&quot;和字符串化操作符&quot;# &quot;及变参宏&quot;...&quot;

C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念). 1.宏定义中字符串化操作符#: #的功能是将其后面的宏参数进行字符串化操作,意思就是对它所应用的宏变量通过替换后在其左右各加上一个双引号. 例如: #define WARN_IF(EXPR)do { if (EXPR) fprintf(stderr, "Warning: " #EXPR "\n");} while(0) 上面代码中的反斜线\主要用来转译换行

宏定义中使用do{}while(0)的好处 (转载)

宏定义中使用do{}while(0)的好处   #define MACRO_NAME(para) do{macro content}while(0) 的格式,总结了以下几个原因: 1,空的宏定义避免warning: #define foo() do{}while(0) 2,存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现. 3,如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现: #define foo(x) /action1(); /action2(); 在以下情况

C宏定义中的 #,##,#@

宏定义中会出现#xxx ,A###B,以及微软独自特有的#@xxx.分别解释. 1 define SB(x) #x 它的作用是把输入的东西转换为字符串 string str = SB(123); 2 define BB(x) UXX##x 这个是个符号连接的作用,把UXX(随意的跟符号x连接成一个新的符号,这里说的符号就是变量的意思 int BB(1); U1 = 100; 3 define CB(x) #@x 作用会是把x的最后一个字符转换成字符,这个是Windows独有的. char b =