va_start用法&函数隐含形参"…"

做的一个C demo如下:

#include “stdio.h”
#include “stdarg.h”//必备

//typedef char* va_list;//已在头文件中定义

int demo(char *title, char *first,…)//用省略号表示函数剩余未列出的隐含形参
{

char *pStr = NULL;

//step 1:一个字符指针,可以理解为指向当前参数的一个指针,取参必须通过这个指针进行。
va_list argptr;

//step 2:初始化,让argptr指向可变参数表里面的第一个隐含参数;第二个参数为最后的可视参数
va_start(argptr, first);

//step 3:va_arg,它的第一个参数是argptr,第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,并且把argptr的位置指向变参表的下一个变量位置
pStr = va_arg(argptr,char*);
printf("%s", pStr);
pStr = va_arg(argptr,char*);
printf("%s", pStr);

//step 4:调用va_end,他是输入的参数argptr置为NULL
va_end(argptr);

}

void main(void)
{
demo(“DEMO”, "Crazy ", "Hello ", “World!\n”);
}

参考:
https://www.runoob.com/cprogramming/c-macro-va_start.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果出现了“类型的实参与 `lpthread_start_routine` 类型的形参不兼容”的错误,通常是因为你在创建线程时传递给 `pthread_create` 函数的第三个参数,也就是线程入口函数的参数类型与 `lpthread_start_routine` 类型的参数类型不匹配。 `lpthread_start_routine` 是一个函数指针类型,它的参数类型是 `void*`,也就是一个指向任意类型数据的指针。因此,当你定义线程入口函数时,它的参数类型也必须是 `void*`。如果你需要在线程中使用其他类型的数据,可以通过类型转换来实现。 下面是一个例子,演示了如何正确使用 `lpthread_start_routine`: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> void* thread_func(void* arg) { int* num = (int*)arg; printf("Thread received value: %d\n", *num); *num = *num * 2; return NULL; } int main() { int num = 10; pthread_t thread; int rc = pthread_create(&thread, NULL, thread_func, (void*)&num); if (rc) { printf("ERROR; return code from pthread_create() is %d\n", rc); exit(-1); } rc = pthread_join(thread, NULL); if (rc) { printf("ERROR; return code from pthread_join() is %d\n", rc); exit(-1); } printf("Thread return value: %d\n", num); return 0; } ``` 上面的例子中,我们创建了一个整型变量 `num`,并将其初始化为 10。然后,我们创建了一个线程,将 `num` 作为参数传递给线程入口函数 `thread_func`。在 `thread_func` 函数中,我们将 `arg` 强制转换为整型指针,并获取 `num` 的值。然后,我们将 `num` 的值乘以 2,并将结果存储在 `num` 中。最后,在主线程中,我们输出了 `num` 的值,以验证线程是否正确地修改了 `num` 的值。 总之,当你在使用 `lpthread_start_routine` 时,一定要确保线程入口函数的参数类型与 `void*` 匹配,并通过类型转换来获取真实的参数类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值