【问题标题】:"Old-style parameter declarations" error“旧式参数声明”错误
【发布时间】:2016-04-13 18:59:08
【问题描述】:

我在尝试编译我的代码时遇到了两个编译错误,我找不到真正的问题所在。有人可以帮忙解释一下吗?

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;
}

【问题讨论】:

  • 看起来您在 printRecords 函数定义中放错了 { 括号..
  • 开头{应该跟在函数参数列表后面。
  • 啊!谢谢你们......现在我收到一个错误,说在我的函数中'printRecords''count'被重新声明为另一种sybole,并附有说明我以前的定义在哪里的注释。但我有void printRecord (STUREC records[], int count) 后跟int count; 的本地声明......这是错误代码指向的两行,但我将它们都放在int,那么错误指的是什么?

标签: c


【解决方案1】:

不是针对这个特定问题,但如果您碰巧遇到此错误,请检查您是否在声明末尾没有遗漏分号,因为这就是发生在我身上的事情。

【讨论】:

    【解决方案2】:

    如果你想使用old style C parameter declarations,你需要这样做:

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

    但这并不是一个好的做法,并且会使您的代码更难阅读。一些编译器甚至不再支持这种语法。

    其他 cmets/answers 说您在函数体中重新声明(并因此隐藏)您的函数参数,但这不是您想要做的(否则您有效丢失正在传入的参数)。

    如果你定义一个这样的函数:

    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 ...
    }
    

    但不要尝试两者兼而有之。

    【讨论】:

    • 是的,我刚把我的 { 向上移动了哈哈,它就解决了。我现在有一个错误,说我在 printRecords 中的计数被重新声明为不同的符号...错误指向第 98 和 94 行。有什么线索吗?
    • @seanncurtis 删除紧跟在{ 之后但在int i; 之前的行。请参阅我回答中的最后一个示例。
    • 哦,我明白了,如果你在启动函数的 () 中声明 count 是一个 int,你不需要在本地声明中声明它吗?
    • 宾果游戏!否则,函数不知道你在说哪一个。
    • 很有意义,谢谢。我现在收到一个在我学习 c 的 4 个月内从未见过的错误。它说'错误:1d返回退出状态'......它没有指代一行或任何东西。
    【解决方案3】:

    你有

    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 中的参数,旧式函数参数意味着您不要将类型放在函数参数声明中。
    • 啊!谢谢你们......现在我收到一个错误,说在我的函数中'printRecords''count'被重新声明为另一种sybole,并附有说明我以前的定义在哪里的注释。但我有void printRecord (STUREC records[], int count) 后跟int count; 的本地声明......这是错误代码指向的两行,但我将它们都放在int,那么错误指的是什么?
    • @mame98 你的例子并没有像你想象的那样。您将参数重新声明为隐藏参数并使函数的其余部分无法访问它们的局部变量。
    猜你喜欢
    • 1970-01-01
    • 2011-06-02
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 2013-03-20
    • 2018-06-11
    相关资源
    最近更新 更多