下面的代码我遇到了一个小问题。 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)
答案 0 :(得分:1)
---编辑,因为原帖有点不对,但同一行可能是原因---
由于错误特别提到找到一个int而不是一个右括号,我怀疑这个有问题的行是
*(arr + sizeof(int) * i) = va_arg(vl, int*);
虽然你的代码是有效的C / C ++,但我会反过来怀疑VS编译器犯了一个错误,但提出了类似的怀疑Qt编译器
va_arg
样式包装器中包含了qt_xxx
个引用,以便在QT框架中进行适当的编译。---原帖如下---
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的编译器才会对象。