2016-04-17 12 views
0

を変数引数を使用しているとき、私は、可変引数で動作し、このようになります機能を持っている:コンパイルエラー

static int getIntValue(const int min,const int max,va_list *vl) 
{ 
    int listValue; 

    listValue=va_arg(*vl,int); 
    if (listValue<min) listValue=min; 
    else if (listValue>max) listValue=max; 
    return listValue; 
} 


unsigned long init_if_list(int *var,va_list vl) 
{ 
    char *listTag; 

    listTag=va_arg(vl,char*); 
    if (!strcmp(listTag,INIT_SHOWUI)) initValues.uiFlags=getIntValue(INT_MIN,INT_MAX,&vl); 

このコードは、Windows/VisualStudioを2012と「古い」GCCのバージョン(のような4.7でうまくコンパイルCentOS 6上で)。しかし、GCC 4.8.4/Ubuntuでコンパイルしようとすると失敗します。ここでエラーが発生します:

error: cannot convert '__va_list_tag**' to '__va_list_tag (*)[1]' for argument '3' to 'int getIntValue(int, int, __va_list_tag (*)[1])' 
    if (!strcmp(listTag,INIT_SHOWUI))    initValues.uiFlags=getIntValue(INT_MIN,INT_MAX,&vl); 

ここで何が間違っていますか? GCCはなぜ不平を言うのですか?

ありがとうございます!

+0

それは2016年、なぜ可変引数ですか? –

+1

'va_list'引数をポインタとして渡さないでください。エラーメッセージを見てみると、すでにポインタが*、つまり '__va_list_tag *'の型名( 'typedef')なので、パスバイエミュレートのためにポインタを使う必要はありません-参照。 –

+0

軌道の軽さのレース:DLLインターフェイスはまだC言語である必要があるため、C++インターフェイスはコンパイラの正確なバージョンに依存します。 – Elmi

答えて

1

常に、va_listを値で渡し、決してポインタで渡しません。したがって

static int getIntValue(const int min, const int max, va_list vl) 

initValues.uiFlags=getIntValue(INT_MIN, INT_MAX, vl);