0

以下に記述されたコードに小さな問題があります。VS 2010 はそれをコンパイルして実行し、予測結果を取得します。しかし、Qt Creator でこのコードをコンパイルしようとすると、毎回この警告が表示されます:「予想されるトークン ')' が int になりました」はい、プログラムは Qt Creator によって実行されますが、プログラムは爆発します。このコードの問題点:

#include <stdio.h>
#include <stdarg.h>
#define ARR_SIZE 2

int **getAddresses(int amount, ...)
{
    static int *arr[ARR_SIZE] = {};
    va_list vl;

    if(amount > 0)
    {
        va_start(vl, amount);
        int i;
        for(i = 0; i < amount; i++)
        {
            *(arr + sizeof(int) * i) = va_arg(vl, int*);  //This one is highlighted by the Qt Creator.
        }
        va_end(vl);
        return 0;
    }
    else
    {
        return arr;
    }
}

int main(void)
{
    int a = 3, b = 5;

    getAddresses(ARR_SIZE, &a, &b);
    printf("BEFORE: %d, %d\n", a, b);

    int **res = getAddresses(0), i;
    for(i = 0; i < ARR_SIZE; i++)
    {
        *(*(res + sizeof(int) * i)) += 5;
    }

    printf("AFTER: %d, %d\n", a, b);

    return 0;
}

事前にご回答いただきありがとうございます。

追加: Qt Creator は、このコード行を強調表示します *(arr + sizeof(int) * i) = va_arg(vl, int*);

さらに、Dev++ は、警告、エラー、クラッシュなしでこのコードを実行できます。

GCC は Fedora Linux 14 でコンパイルできます。

[Admin@localhost testerprog]$ gcc tester.c -o tester
[Admin@localhost testerprog]$ ls
tester  tester.c
[Admin@localhost testerprog]$ ./tester
BEFORE: 3, 5
AFTER: 8, 10
[Admin@localhost testerprog]$ 

GCC バージョンは 4.5.1 20100924 (Red Hat 4.5.1-4) です。

4

2 に答える 2

1

---元の投稿が少し間違っているため、編集しましたが、同じ行が原因である可能性があります---

エラーは、閉じ括弧の代わりに int を見つけることに具体的に言及しているので、問題のある行は

        *(arr + sizeof(int) * i) = va_arg(vl, int*);

そして、あなたのコードは有効な C / C++ ですが、VS コンパイラが間違いを犯したという私の疑いを覆しますが、Qt コンパイラが

  1. バグがあり、型ではなく R 値を期待しています。
  2. QT フレームワークで適切にコンパイルできるようにva_arg、他のスタイルのラッパーで参照をラップしています。qt_xxx

--- 元の投稿に続く ---

int は C / C++ のキーワードであるため、安全に変数として使用することはできません。ラインのようです

        *(arr + sizeof(int) * i) = va_arg(vl, int*);

int ポインターによって参照される値ではなく、変数intによって保持されるアドレスの値を要求します。おそらく、VS コンパイラのエラー チェックはそれほど堅牢ではないため、エラーが黙って受け入れられる可能性があります。

于 2012-05-24T16:24:53.090 に答える
0
    va_start(vl, amount);
    int i;

それはCではありません。

定義はコードの前に行う必要があります。

C/C++ モードのようなものを実行している VC は気にしません。C のみのコンパイラは反対します。

于 2012-05-24T16:27:34.710 に答える