码迷,mamicode.com
首页 > 其他好文 > 详细

1. 宏定义

时间:2019-06-15 17:33:12      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:art   style   http   getch   def   fine   dem   include   语言   

【1】C/C++ 中##(两个井号)和#(一个井号)

参考博客:https://www.cnblogs.com/devcjq/articles/2430700.html 

## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。

#符是把传递过来的参数当成字符串进行替代。

假设程序中已经定义了这样一个带参数的宏:

#define PRINT( n ) printf( "token" #n " = %d", token##n )

同时又定义了二个整形变量:

int token9 = 10;

现在在主程序中以下面的方式调用这个宏:

PRINT( 9 );

那么在编译时,上面的这句话被扩展为:

printf( "token" "9" " = %d", token9 );

最终输出为:token9 = 10

代码为:

#define PRINT(n) printf("variable"#n" is %d\n",variable##n)

int main()
{
    int variable1 = 4;
    PRINT(1);
    int variable2 = 6;
    PRINT(2);
}

<<variable1 is 4
<<variable2 is 6

 

【2】可变输入参数个数

采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数。但在某些情况下希望函数的参数个数可以根据需要确定。典型的函数printf()、scanf()和系统调用execl()等

例子如下:

#include <stdarg.h>

int demo(string msg, ...)
{
    va_list argp;
    int id = 0;
    int value;
    va_start(argp,msg);//获取msg后的参数,本质是一个指针而不是一个容器
    while (true)
    {
    value = va_arg(argp,int);
    if(value==0) break;
    printf("Parameter%d  : %d\n",id++,value);
    }
    va_end(argp);
    return 0;
}

int main()
{
    demo("TEST",5,4,3,2,1,0);//第一个参数只是一个标识,并不在参数表中。
    getchar();
    return 0;
}

 

1. 宏定义

标签:art   style   http   getch   def   fine   dem   include   语言   

原文地址:https://www.cnblogs.com/2Bthebest1/p/11027933.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!