“Old-style parameter declarations”错误

10
我在编译代码时遇到了两个错误,但我无法确定问题所在。请问有人能帮忙解决吗?
error: old-style parameter declarations in prototyped function definition
error: 'i' undeclared (first use in this function)

代码:

void printRecords (STUREC records[], int count)

STUREC records[ARRAY_MAX];
int count;
int i;
{
    printf("+---------------------------+--------+--------+--------+--------+--------+--------+---------+-------+\n");
    printf("| Student Name | ID | Test 1 | Test 2 | Proj 1 | Proj 2 | Proj 3 | Average | Grade |\n");
    printf("+---------------------------+--------+--------+--------+--------+--------+--------+---------+-------+\n");

    for (i = 0; i < count; i++)
    {
        size_t j;
        printf ("|%s|%d|%d|%d|%d|%d|%d|%f|%c|", records[i].name, records[i].id, records[i].score1,
                 records[i].score2, records[i].score3, records[i].score4, records[i].score5,
                  records[i].ave, records[i].grade);
    }

    return;
}

2
看起来你在 printRecords 函数定义中错放了 { 括号。 - jboockmann
左大括号 { 应该跟随函数参数列表。 - Eugene Sh.
啊!谢谢大家...现在我遇到了一个错误,说在我的函数'printRecords'中'recount'被重新声明为不同类型的符号,并注明了我的先前定义位置。但是我有void printRecord (STUREC records[], int count)后面跟着一个局部声明的int count;...这两行是错误代码指向的地方,但我都将它们声明为int类型,那么错误可能是指什么呢? - champlooSIXSIX
3个回答

21

针对这个具体问题可能不适用,但如果你遇到了这个错误,请检查您的声明末尾是否漏掉了分号,因为这就是我遇到的问题。


3
节省了我很多时间,没有在我的函数原型末尾添加分号。 - kamdaou

3
如果你想使用旧式C参数声明, 你需要这样做:
void printRecords(records, count)
    STUREC records[ARRAY_MAX];
    int count;
{
    int i;
    // ... rest of the code ...
}

但这不被认为是一个好的实践,会使你的代码更难读。一些编译器甚至已经停止支持这种语法。
其他的评论/答案都在说你在函数体内重新声明了函数参数,从而隐藏了它们,但这并不是你想要做的(否则你就会失去传递进来的参数)。
如果你像这样定义一个函数:
void fxn(int num) {
    int num;
    num = num;
}

“num”指的是参数还是局部变量?

可以这样做:

void printRecords(records, count)
    STUREC records[ARRAY_MAX];
    int count;
{
    int i;
    // ... rest of the code ...
}

或这样做:

void printRecords(STUREC records[], int count)
{
    int i;
    // ... rest of the code ...
}

但不要尝试同时做两者或混合两者。

@seanncurtis 在 {int i; 之间立即删除这些行。请参考我回答中的最后一个示例。 - callyalater
哦,我明白了。如果你在函数开始的()中声明count是一个int类型,那么你就不需要在本地声明中再声明一次了吗? - champlooSIXSIX
太好了!否则,函数不知道你在说哪一个。 - callyalater
非常清晰,谢谢。现在我遇到了一个我在学习C语言的四个月中从未见过的错误。它说“错误:1d返回退出状态”...但它没有指明是哪一行或其他任何信息。 - champlooSIXSIX
那是一个链接器错误,与你在这里提出的问题完全不同。关于“ld returned exit status 1”的答案在SO和在线上有很多。 - callyalater
显示剩余4条评论

1
你有
void printRecords (STUREC records[], int count)

STUREC records[ARRAY_MAX];
int count;
int i;
{

但我猜你想要的是:

但我猜你想要的是:

void printRecords (STUREC records[], int count)
{
    int i;

编辑:感谢callyalater注意到该函数中参数的重新声明...


此外,i 不是 printRecords 的参数,而旧式函数参数意味着您不需要在函数参数声明中放置类型。 - callyalater
啊!谢谢大家...现在我遇到了一个错误,说在我的函数'printRecords'中'recount'被重新声明为不同类型的符号,并注明了我的先前定义位置。但是我有void printRecord (STUREC records[], int count)后面跟着一个局部声明的int count;...这两行是错误代码指向的地方,但我都将它们声明为int类型,那么错误可能是指什么呢? - champlooSIXSIX
@mame98 你的例子并不是你认为的那样。你重新声明了参数作为局部变量,这样会隐藏参数,并使它们在函数的其余部分无法访问。 - callyalater

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接