簡體   English   中英

可變參數列表:使用va_list還是形式參數的地址?

[英]Variable argument list: use va_list or address of formal parameter?

下面的代碼包含2個函數,這兩個函數均計算提供的整數值列表的和:

#include <iostream>
#include <stdarg.h>

using namespace std;

int sum_1 ( int number_of_values, ... )
{
    va_list arguments;
    va_start ( arguments, number_of_values );
    int sum = 0;
    for ( int i = 0; i < number_of_values; i++ )
    {
        sum += va_arg ( arguments, int );
    }
    va_end ( arguments );

    return sum;
}

int sum_2 ( int number_of_values ...)
{
    int sum = 0;
    for ( int i = 0; i < number_of_values; i++ )
        sum += *( &number_of_values + i + 1 );
    return sum;
}


int main()
{
    cout << sum_1(3, 1, 2, 3) << endl; //prints 6
    cout << sum_2(3, 1, 2, 3) << endl; //prints 6
}

sum_1使用va_list方法, sum_2使用所提供的number_of_values變量的地址,相對於該變量,它查找其他值並將其相加。

那么這兩種方法有什么區別? 使用哪一個? 第二個看起來較短,那么定義va_listva_startva_artva_end什么?

第二個版本是不可移植的,這是使用第一個版本的強烈理由。

僅當您的平台上以特定方式將函數的參數放在堆棧中時,第二個版本才有效。 使用varargs可以將其抽象化,這就是第一個版本可移植的原因。

第二種方法假設參數如何傳遞給函數。 無需滿足這些假設。 這就是va_list及其伙伴存在的原因:庫供應商知道如何傳遞參數,並且可以正確實現代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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