C专家我正在尝试学习c和我的hp-ux上的编译器使用K&R
我一直在
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);
}
提前感谢任何输入
好主,HP-UX C编译器仍然默认为K&R ?!这在20年前是有点可以原谅的,现在不是那么多了。
要使其编译为K&R(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下,如果编译器在看到该函数的声明之前看到函数调用,它将假定函数返回int
。由于我已经宣布Usage
返回上面的int
(因为K&R中没有void
类型),此代码将在K&R下编译。
如果我已经定义了Usage
来返回除int
之外的任何类型,编译器会抱怨隐含声明和函数定义之间的类型不匹配。
从C99开始,不再允许隐式int
类型,因此必须在使用前显式声明或定义所有函数。