• 1. 宏定义


    【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

    代码为:

    #include "cpp.h"
    
    int getSystemTime()
    {
        return 12131421;
    }
    #define PRINT(n) printf("%d variable"#n" is %d
    ",getSystemTime(),variable##n)
    #define SET(n)  variable##n
    #define Info()  printf("%s  %d  %d  %s
    ",__DATE__,__LINE__,__TIME__,__FILE__)
    int main() { int variable1 = 4; PRINT(1); int variable2 = 6; PRINT(2); int SET(5)=10; PRINT(5); Info(); } 输出为: 12131421 variable1 is 4 12131421 variable2 is 6 12131421 variable5 is 10 Jun 15 2019 20 4231353 ..CppStudymacro.cpp

     将函数宏的形参列表最后的参数用省略号(...)表示即实现了变参函数。__VA_ARGS__用于在宏替换部分中,表明省略号代表什么。

    #define P(...) printf(__VA_ARGS__)

    ##__VA_ARGS__ 宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用

    #define P2(n,...) printf("%s %d "#n"
    ",__DATE__,__LINE__,##__VA_ARGS__)

    【2】  :在宏定义时用于将不同行的上下文连接成一行

    #define FUNTION(X,Y)    (X)
    
    *(Y)

    【3】ANSI C标准中有几个标准预定义宏(也是常用的):

    __DATE__:在源文件中插入当前的编译日期
    __TIME__:在源文件中插入当前编译时间;
    __FILE__:在源文件中插入当前源文件路径及文件名;
    __LINE__:在源代码中插入当前源代码行号;

    ====================================================

    【4】可变输入参数个数

    采用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
    ",id++,value);
        }
        va_end(argp);
        return 0;
    }
    
    int main()
    {
        demo("TEST",5,4,3,2,1,0);//第一个参数只是一个标识,并不在参数表中。
        getchar();
        return 0;
    }
  • 相关阅读:
    红帽7 Shell编程
    红帽7 vim编辑器
    红帽7 管道符、重定向与环境变量
    红帽7 systemctl管理服务的启动、重启、停止、重载、查看状态等常用命令
    python 装饰器详解
    红帽7 常用系统命令
    转 JSON详解
    转 C# using 三种使用方式
    存储过程详解 转
    使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转)
  • 原文地址:https://www.cnblogs.com/2Bthebest1/p/11027933.html
Copyright © 2020-2023  润新知