C 参数缺省

文章展示了如何在C语言中使用可变参数列表,通过`__VA_ARGS__`宏处理不同数量的参数。文中给出了多个示例,包括定义带有可变参数的函数和宏,以及如何检查和使用这些参数。此外,还提到了在宏定义中处理空参数列表的方法。
摘要由CSDN通过智能技术生成
#include <stdio.h>
#include <stdarg.h>

void greet(char *name, ...) {
    char *message = "Hello";
    
    va_list args;
    va_start(args, name);
    
    if (va_arg(args, int) == 1) {
        message = va_arg(args, char *);
    }
    
    printf("%s, %s!\n", message, name);
    
    va_end(args);
}

int main() {
    greet("Alice", 1, "Hi");
    greet("Bob");
    return 0;
}
#include <stdio.h>
#include <stdarg.h>

void greet(char *name, ...) {
    char *message = "Hello";
    
    va_list args;
    va_start(args, name);
    
    char *message2 = va_arg(args, char* );
    if (message2 != NULL) {
         printf("%s, %s!\n", message2, name);
    }
    else
    printf("%s, %s!\n", message, name);
    
    va_end(args);
}

int main() {
    greet("Alice","Hi");
    greet("Bob");
    return 0;
}

Hi, Alice!
Hello, Bob!

#include <stdio.h>
#include <stdarg.h>

void greet(char *name,int id, ...) {
    char *message = "Hello";
    
    va_list args;
    va_start(args, id);
    
    char *message2 = va_arg(args, char* );
    if (message2 != NULL) {
         printf("%s, %d, %s!\n", message2,id, name);
    }
    else
    printf("%s, %d, %s!\n", message, id,name);
    
    va_end(args);
}

int main() {
    greet("Alice", 1, "Hi");
    greet("Bob",2,"ppp");
    return 0;
}

Hi, 1, Alice!
ppp, 2, Bob!

__VA_ARGS__是一个在预处理阶段展开为可变参数列表的宏。在C语言中,如果需要定义一个带有可变数量参数的函数或者宏,可以使用…来表示可变参数列表。而在宏定义中,为了能够处理不同数量的可变参数,需要使用__VA_ARGS__来代表可变参数列表,并将其展开为实际的参数。例如:

#define LOG(format, ...) printf(format, ##__VA_ARGS__)

这个宏定义中,LOG是一个格式化输出日志信息的宏,其中format是一个字符串表示输出格式,__VA_ARGS__用于接收可变参数列表,并使用printf函数输出日志信息。

需要注意的是,在使用__VA_ARGS__时,还需要加上##操作符来处理可变参数列表为空的情况,以避免编译器产生错误。

#include <stdio.h>
#include <stdarg.h>

#define GREET(name,...) greet(name,##__VA_ARGS__)

void greet(char *name, ...) {
    char *message = "Hello";
    
    va_list args;
    va_start(args, name);
    
    int message2 = va_arg(args, int);
    if (message2 != NULL) {
        printf("~%d, %s!\n", message2, name);
    }
    else
    printf("%s, %s!\n", message, name);
    
    va_end(args);
}

int main() {
    greet("Alice",1);
    greet("Bob");
    GREET("Joe",3);
    return 0;
}

~1, Alice!
Hello, Bob!
~3, Joe!

#include <stdio.h>

typedef struct {
    int i;
    int x;
    int y;
} f_args;
f_args in = {.i = 0, .x = 0, .y = 0}; 

void var_f(f_args in)
{
    //printf("A%d %d %d\n",in.i,in.x,in.y);
    int i_out = in.i ? in.i : 8;
    int x_out = in.x ? in.x : 99;
    int y_out = in.y ? in.y : 99;
    printf("B%d %d %d\n",i_out,x_out,y_out);
}
#define f(...) var_f((f_args){__VA_ARGS__})

int main() {
    f(4,3,5);
    f(4,3);
    f(4);
    return 0;
}

B4 3 5
B4 3 99
B4 99 99
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值