“预期令牌”)在C中“得到了”

时间:2012-05-24 16:19:14

标签: c qt-creator

下面的代码我遇到了一个小问题。 VS 2010编译它,运行并获得预测结果。但是当我尝试使用Qt Creator编译此代码时,我每次都会收到此警告:“Expected token”)“int 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;
}

事先感谢您的回答。

ADDED: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)

2 个答案:

答案 0 :(得分:1)

---编辑,因为原帖有点不对,但同一行可能是原因---

由于错误特别提到找到一个int而不是一个右括号,我怀疑这个有问题的行是

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

虽然你的代码是有效的C / C ++,但我会反过来怀疑VS编译器犯了一个错误,但提出了类似的怀疑Qt编译器

  1. 其中有一个错误,并期待一个R值,而不是一个类型。
  2. 在其他va_arg样式包装器中包含了qt_xxx个引用,以便在QT框架中进行适当的编译。
  3. ---原帖如下---

    int是C / C ++中的关键字,因此您无法安全地将其用作变量。看来就行了

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

    请求变量 int 所持有的地址的值,而不是int指针引用的值。可能性是VS编译器的错误检查不够健壮,导致无法接受错误。

答案 1 :(得分:0)

    va_start(vl, amount);
    int i;

那不是C。

定义必须在代码之前发生。

VC运行它的C / C ++模式并不介意。只有C的编译器才会对象。