我们有一段代码将一个va_list
复制到另一个代码,代码实现如下:
va_list src;
va_list dest;
if(src)
va_copy(dest, src);
问题是,如果发出所有警告,我会收到以下信息:
警告:'src'的地址将始终评估为'true'
我知道这是因为va_list
本质上是一个数组,因此src
是一个始终评估为true的地址。
既然va_list
也可以作为非数组实现,我不想删除这个if
检查,因为之后的某个地方它被解除引用并且可能导致崩溃。此实现是否依赖于编译器,平台或其他东西?我可以强迫它到阵列吗?
答案 0 :(得分:1)
如果使用va_copy()
或src
正确初始化va_list
,您只能使用src
宏va_start
作为来源va_copy
。 va_list
的实施方式无关紧要,将va_list
作为NULL
进行测试毫无意义。
答案 1 :(得分:1)
删除条件。当if (src)
具有类型src
时,va_list
始终无效(无意义)。跟踪特定va_list
是否已经初始化或销毁(通过va_start
或va_end
)取决于您的程序逻辑,并且无法通过检查va_list
来确定以任何方式反对。因此,如果有可能它可能尚未初始化,那么您还有其他错误需要修复......
答案 2 :(得分:0)
每{{}}} - va_copy
只能在已初始化的src
va_list
上使用。之后dest
将有效。 dest
永远不应被“取消引用” - 如果你这样做,你的用法就会被破坏:你只能使用va_copy
,va_arg
和va_end
。