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. 已将va_arg引用包装在一些其他qt_xxx样式的包装器中,以允许在 QT 框架中正确编译。

--- 原帖如下---

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 回答