求教:可变参数函数中 va_list 的定义问题
最近把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 被定义为一个数组的首地址了,要赋值必须使用 { } 括号
这是为什么????
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语言的方式来实现
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中,所以用到可变参数的程序应该包含这个头文件.下面我们写一个简单的可变参数的函数,该函数至少有一个整数参数,第二个参数也是整数,是可选的.函
详解_C语言可变参数_va_list和_vsnprintf及printf实现
详解_C语言可变参数_va_list和_vsnprintf及printf实现
va_start、va_end、va_list的详细使用方法
va_start、va_end、va_list的详细使用方法,对想了解的人很有帮助。
va-list原理解释
va_list原理解释,解释了关于VA_LIST的用法、VA_LIST在编译器中的处理、VA_LIST应该注意的问题、以及相关程序


