K& R函数声明

时间:2017-05-03 13:56:28

标签: c function gcc

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

我一直在

  1. 第32行:错误1584:类型声明不一致:“用法”
  2. 第33行:错误1705:函数原型是ANSI特征
  3. 警告419:为阵列argv
  4. 分配的零长度存储
    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);
    }
    

    提前感谢任何输入

1 个答案:

答案 0 :(得分:3)

好主,HP-UX C编译器默认为K&amp; R ?!这在20年前是有点可以原谅的,现在并没有那么多。

要将此编译为K&amp; 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&amp; R风格的函数定义。

修改

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

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

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