【问题标题】:"Expected token ')' got int" in CC中的“预期令牌')'得到了int”
【发布时间】:2012-05-24 16:19:14
【问题描述】:

我对下面编写的代码有一个小问题。 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)

【问题讨论】:

  • 你知道在哪一行吗?如果是,请将其添加到代码中的注释中。
  • 也在 gcc 中编译。错误是否出现在头文件中?
  • 行号错误,请。
  • 感谢您的回答。 Qt creator 强调了这一点: (arr + sizeof(int) * i) = va_arg(vl, int);但是当程序崩溃时,即使在调试模式下也找不到任何线索。

标签: c qt-creator


【解决方案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 编译器的错误检查没有那么健壮,导致对错误的无声接受。

【讨论】:

  • @OliCharlesworth 是的,我在发布后就意识到了这个错误,但我立即更新了它(正如你评论的那样)。很抱歉造成混乱。
  • 请不要说 C/C++。这是 C,而不是 C++,正如您在标题中看到的那样(stdarg.h,不是 cstdarg)
  • 您对 Qt Creator 突出显示的代码行是正确的。
  • 那么,Qt Creator 正在扼杀va_arg(vl, int*) 中的int*。可能是这个错误bugreports.qt-project.org/browse/QTSDK-145 已修复。可能 qt 编译器看到指针并认为它是一个变量的解引用,而不是指针类型。
  • @Edwin Buck,谢谢。我想,我必须更新 Qt SDK 并再试一次。
【解决方案2】:
    va_start(vl, amount);
    int i;

那不是 C。

定义必须在代码之前。

VC 运行它的 C/C++ 模式不会介意。纯 C 编译器会反对。

【讨论】:

  • 因为编译器是MSVC,只做C90。 Charles Bailey 删除的答案实际上是这里最好的答案。
  • Banahan 等人是否为 C99 制作了“The C Book”版本?我读过的最好的教科书。
  • @David: 但是错误发生在 Qt,not 发生在 MSVC - 我认为这是因为 MSVC 给了这个 C++ 处理并且不介意定义的位置.
  • @David:我认为 OP 表示 Qt 发出警告,因为他可以运行代码。 Qt 可能只是在处理它并在此时定义变量 - 它会崩溃,因为代码中的其他地方存在错误。
  • @Blank Xavier:不,这里看到的这段代码只是程序中的代码。
猜你喜欢
  • 2015-02-26
  • 2022-09-22
  • 1970-01-01
  • 2018-12-04
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
相关资源
最近更新 更多