[英]Passing part of a va_list
我將如何傳遞va_list的一部分或將其復制到從第n個元素開始的另一個va_list中?
int main (int x, char**argv) {
va_list clientArgs;
va_copy(clientArgs, argv[3]); // get all input parameters after 3rd cmd line arg
foo(clientArgs);
va_end(clientArgs);
....
還是使用va_copy方法...?
任何代碼都不是可移植的,甚至不能保證正常工作(未定義的行為等)
但是,如下面的代碼所示,這是可能的:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <stdarg.h>
void VarShowArgs(int n, va_list args)
{
for(int i=0; i<n; ++i)
{
printf("Arg #%d: %d\n", i+1, va_arg(args, int));
}
}
void ShowArgs_StartAtFourthParam(int n, ...)
{
va_list args;
int dummy;
va_start(args,n); // n is param #1 (value = 8)
dummy = va_arg(args, int); // Remove Param #2 from args (value = 1)
dummy = va_arg(args, int); // Remove Param #3 from args (value = 2)
// Show arguments starting at Param #4 (which should be value = 3)
VarShowArgs(n - 2, args); // Minus 2 because we removed 2 params from the args.
va_end(args);
}
int main(void)
{
// First param says how many more args there will be.
// This function shows the values starting at the 4th argument (value = 3)
ShowArgs_StartAtFourthParam(8, 1, 2, 3, 4, 5, 6, 7, 8);
getch();
return 0;
}
產量
Arg #1: 3
Arg #2: 4
Arg #3: 5
Arg #4: 6
Arg #5: 7
Arg #6: 8
您是什么意思“ va_list的一部分”? 這個問題並沒有多大意義。
va_list
是一個迭代器對象,它允許您一次遍歷一個函數的參數va_start
將其初始化為指向當前函數的特定參數之后的參數,而va_arg
獲取(復制)當前指向的參數參數並將其遞增以指向下一個參數。
va_list
在任何情況下都不會封裝參數列表-它只是引用參數列表的抽象指針式對象。
您可以將指向va_list
對象的指針傳遞給其他函數,並使該函數調用va_arg
來處理某些參數。 返回后,您可以調用va_arg
來處理更多參數,但這並沒有真正復制參數列表。
您可以使用va_copy
復制va_list
,以使兩個迭代器遍歷參數列表。 然后,每個參數都是獨立的,因此每個參數都將在va_copy
完成后看到所有參數。
除了引用作為參數傳遞給當前函數的參數外,無法創建引用任何其他內容的va_list
對象...
您不能直接這樣做。 va_start
的第二個參數應該是函數參數列表中省略號(...)之前的最后一個參數的名稱。 使用其他任何東西最多只能導致未定義的行為。
為了能夠大致了解所需內容,您必須知道va_list
。 您可以使用va_arg()
讀取它們,然后將va_list
的剩余內容傳遞給其他函數:
void function(int arg1, char *arg2, ...)
{
va_list args;
va_start(args, arg2);
int i = va_arg(args, int);
double d = va_arg(args, double);
foo(args);
va_end(args);
}
顯然,如果變量列表中的參數都是相同的類型,則可以使用循環來迭代前N個此類參數。 注意,沒有辦法找出提供了多少個參數。 您的代碼必須“知道”。 例如, printf()
使用格式字符串告訴它提供了多少個參數(以及每個參數的類型)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.