C K&;R错误:方法定义冲突
我正在通过K&R(第二版)学习C,因为我一直在努力学习低级语言,以帮助我编程,也因为我想了解C。这本书非常棒;但是,他们在第29页(第1.9节字符数组)上提供的程序无法编译。这是密码C K&;R错误:方法定义冲突,c,stdio,kernighan-and-ritchie,C,Stdio,Kernighan And Ritchie,我正在通过K&R(第二版)学习C,因为我一直在努力学习低级语言,以帮助我编程,也因为我想了解C。这本书非常棒;但是,他们在第29页(第1.9节字符数组)上提供的程序无法编译。这是密码 #include <stdio.h> #define MAXLINE 1000 /* maximum input line size */ int getline(char line[], int maxline); void copy(char to[], char from[]); /*
#include <stdio.h>
#define MAXLINE 1000 /* maximum input line size */
int getline(char line[], int maxline);
void copy(char to[], char from[]);
/* print longest input line */
main()
{
int len; /* current line length */
int max; /* maximum length seen so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */
max = 0;
while ((len = getline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0) /* there was a line */
printf("%s", longest);
return 0;
}
/* getline: read a line int s, return length */
int getline(char s[], int lim)
{
int c, i;
for (i = 0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
/* copy: copy 'from' into 'to'; assume to is big enough */
void copy(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
#包括
#定义MAXLINE 1000/*最大输入行大小*/
int getline(字符行[],int maxline);
无效副本(字符到[],字符从[]);
/*打印最长输入行*/
main()
{
int len;/*当前线路长度*/
int max;/*到目前为止看到的最大长度*/
字符行[最大行];/*当前输入行*/
字符最长[MAXLINE];/*保存在此处的最长行*/
max=0;
而((len=getline(line,MAXLINE))>0)
如果(长度>最大值){
max=len;
副本(最长,行);
}
如果(max>0)/*有一条线*/
printf(“%s”,最长);
返回0;
}
/*getline:读取一行int s,返回长度*/
int getline(字符s[],int lim)
{
int c,i;
对于(i=0;i这种方法通过不包含有问题的头来避免您的问题。相反,它将本地复制实现中所需的所有声明。
这是一个非常糟糕的想法,因为这些函数的声明可能会在您不知道的情况下更改,在这种情况下,您的代码将传递或接收错误的输入
#define MAXLINE 1000 /* maximum input line size */
int getline(char line[], int maxline);
void copy(char to[], char from[]);
int printf(const char *format, ...);
int getchar(void);
/* print longest input line */
int main()
{
int len; /* current line length */
int max; /* maximum length seen so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */
max = 0;
while ((len = getline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0) /* there was a line */
printf("%s", longest);
return 0;
}
/* getline: read a line int s, return length */
int getline(char s[], int lim)
{
int c, i;
for (i = 0; i<lim-1 && (c=getchar())!=-1 && c!='\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
/* copy: copy 'from' into 'to'; assume to is big enough */
void copy(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
#定义MAXLINE 1000/*最大输入行大小*/
int getline(字符行[],int maxline);
无效副本(字符到[],字符从[]);
int printf(常量字符*格式,…);
int getchar(void);
/*打印最长输入行*/
int main()
{
int len;/*当前线路长度*/
int max;/*到目前为止看到的最大长度*/
字符行[最大行];/*当前输入行*/
字符最长[MAXLINE];/*保存在此处的最长行*/
max=0;
而((len=getline(line,MAXLINE))>0)
如果(长度>最大值){
max=len;
副本(最长,行);
}
如果(max>0)/*有一条线*/
printf(“%s”,最长);
返回0;
}
/*getline:读取一行int s,返回长度*/
int getline(字符s[],int lim)
{
int c,i;
对于@Olaf评论的(i=0;i,getline()
是标准POSIX
K&R第二版是ansi 89标准
只需在ansi模式下编译,以防止与POSIX库发生冲突:
gcc -ansi source.c
编辑:
OP想知道他是否可以避免重命名getline
。我知道。我问我是否可以保留getline
的定义,并以某种方式覆盖stdio.h
的定义。不要自己声明标准库的函数!它们可能实际上是宏,具有特定于实现的属性,等等。使用standard headers.OP应该重命名她的函数。@Olaf,这是一个具体的例子,也是获得OP想要的东西的唯一可能的方法,不是所有的东西都是黑的或白的。它被清楚地提到了there@EliSadoff这是否回答了您的问题Eli?对于您在
中声明的参考。对于您的问题,除了重命名之外,没有其他解决方案在函数中,不能有两个同名的符号和两个不同的声明。可以将操作系统更改为非posix版本,也可以重命名函数。其中一个最快。1)C不支持方法,只支持函数2)K&R教授的是一种过时的、不符合标准的C语言版本。请使用最近的一本书。@Olaf方法和函数之间真的有区别吗?我听说它们是可以互换的。@GauravSehgal:1)getline
是POSIX,而不是C2)K&R只是过时了。你的工具链是什么,代码是在(x86 gcc)上编译的,测试了从4.8到6.1gcc:4.2.1和LLVM:7.3.0的多个gcc版本。我在我的计算机上尝试了gcc-4.8
和gcc-6
两种版本,但它仍然无法编译。尝试更新的编译器4.2.1是从2008年开始的,我不知道该版本上的正确标志,可能需要其他东西来显式禁用posix,这是我所能做到的最早的在godbot is 4.4.7上进行测试这是我所能帮助的,您的工具链可能有问题。至少在linux x64上,它对我来说还可以。