簡體   English   中英

傳遞va_list的一部分

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM