【问题标题】:K & R function declaration [closed]K&R函数声明[关闭]
【发布时间】:2017-05-03 13:56:27
【问题描述】:

C 专家我正在尝试学习 c,而我的 hp-ux 上的编译器使用 K & R

我一直有

  1. 第 32 行:错误 1584:不一致的类型声明:“Usage”
  2. 第 33 行:错误 1705:函数原型是 ANSI 功能
  3. 警告 419:为数组 argv 分配零长度存储
int main(c,v) 
{
    int result; 
    int errno;
    int argc; 
    char *argv[];

    if(argc < 3 || argc > 3) {
        Usage(argv[0]);
        exit(1);
    }

    system("clear");
    result = Search_in_File(argv[1], argv[2]);
    if(result == -1) {
        perror("Error");
        printf("Error number = %d\n", errno);
        exit(1);
    }
    return(0);
}

void Usage(char *filename) 
{
    printf("Usage: %s <file> <string>\n", filename);
    printf("%s version 1.0 \nCopyright(c) CodingUnit.com\n", filename);
}

提前感谢您的任何意见

【问题讨论】:

  • 缩进.............
  • int main(c,v) => int main(argc,argv)
  • 另外,您正在混合 ANSI 和非 ANSI 样式。 K&R:这艘船已经航行了。请使用ANSI
  • @Jean-François Fabre:那就是 K&R 中的int main(c,v) int c; char **v; { ...int c 可以省略。当然,名称无关紧要,但参数声明应该在第一个 { 之前。像在 OP 的代码中那样在本地声明它们是行不通的。
  • 确实! OP 的 K&R 也生锈了……好吧,没关系,让我们不要使用它

标签: c function gcc


【解决方案1】:

天哪,HP-UX C 编译器仍然默认为 K&R?!这在 20 年前是可以原谅的,但现在不是那么多了。

要将此编译为 K&R (pre-ANSI) C,请按如下方式更改函数定义:

int main( argc, argv )
  int argc;            /* move declaration of argc and argv from the */
  char **argv;         /* body of main to here */
{      
  /* leave everything else the same */
}

int Usage( filename ) /* void was introduced in C89, don't think it existed in K&R */
  char *filename;
{
  /* leave the same */
}

话虽如此,正确的答案是使用正确的函数原型并找到将编译器置于 C90(或更高版本)模式的命令行选项,或者使用gcc没有人 应该在新代码中使用 K&R 风格的函数定义。

编辑

请注意,在 K&R 和 C89/90 下,如果编译器在看到函数声明之前看到函数 call,它将假定该函数返回 int。由于我在上面声明了Usage 以返回int(因为K&R 中没有void 类型),所以这段代码将在K&R 下编译。

如果我定义Usage 来返回int 以外的任何类型,编译器会抱怨隐含 声明和函数定义之间的类型不匹配。

从 C99 开始,不再允许隐式输入 int,因此所有函数必须在使用前显式声明或定义。

【讨论】:

  • 20 年前我使用的是 HPUX,但我从未使用过 K&R。我相信 cc HP 编译器有一个 --ansi 标志。
  • main 中的“其他一切保持不变”的评论不正确。他需要去掉函数体中argc和argv的声明。
  • @JeremyP:编辑清楚。
  • 点个赞。顺便说一句,K&R 没有 void 类型是正确的。
  • 解决 HPUX 问题的唯一好方法是使用一罐汽油和打火机并尝试获得保险检查
猜你喜欢
  • 2011-03-06
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
相关资源
最近更新 更多