求教:可变参数函数中 va_list 的定义问题

zhiys zhiys 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近把32位系统下的程序,转到64位系统下重新编译,编译中提示一个奇怪的错误

error: array must be initialized with a brace-enclosed initializer

这个错误是针对我的一个函数中使用的可变参数 va_list pointer的,
我定义了 va_list pointer=NULL ;
这是因为我检查 va_list 的定义 在 /usr 目录下搜索:
./lib64/gcc/x86_64-linux-gnu/4.3/include/stdarg.h:typedef __gnuc_va_list va_list;
./include/err.h:# define __gnuc_va_list __ptr_t
./include/sys/cdefs.h:#define __ptr_t void *
所以 va_list 就是 void * .
所以我定义 pointer 变量时,同时给了 NULL 作为初始值。
而且这么写,在32位 linux 下编译通过了,但在64位时会报上面的错。
只有我修改为 va_list pointer ; 不给 NULL 初始值才正确。
而根据错误的提示,似乎 va_list 被定义为一个数组的首地址了,要赋值必须使用 { } 括号
这是为什么????
...全文

相关推荐

关于C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)

可变参数的函数原理其实很简单,而va系列是以宏定义来定义的,实现跟堆栈相关.我们写一个可变函数的C函数时,有利也有弊,所以在不必要的场合,我们无需用到可变参数。如果在C++里,我们应该利用C++的多态性来实现可变参数的功能,尽量避免用C语言的方式来实现

weixin_38711008

va_list(),va_start(),va_arg(),va_end() 详细解析

(一)写一个简单的可变参数的C函数 下面我们来探讨如何写一个简单的可变参数的C函数.写可变参数的C函数要在程序中用到以下这些宏: 代码如下:void va_start( va_list arg_ptr, prev_param );type va_arg( va_list arg_ptr, type );void va_end( va_list arg_ptr );va在这里是variable-argument(可变参数)的意思.这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件.下面我们写一个简单的可变参数的函数,该函数至少有一个整数参数,第二个参数也是整数,是可选的.函

weixin_38506835

详解_C语言可变参数_va_list和_vsnprintf及printf实现

详解_C语言可变参数_va_list和_vsnprintf及printf实现

Frozen_Kin

va_start、va_end、va_list的详细使用方法

va_start、va_end、va_list的详细使用方法,对想了解的人很有帮助。

mokelan

va-list原理解释

va_list原理解释,解释了关于VA_LIST的用法、VA_LIST在编译器中的处理、VA_LIST应该注意的问题、以及相关程序

仲漫
评论 2
收藏 已收藏
分享
返回顶部
zhiys
C语言 70,040 成员 243,237 内容