之前的'功能'声明在C中

时间:2012-11-04 02:28:53

标签: c

  

可能重复:
  Learning C by K&R, error when trying to compile programs from book with arrays and function calls

在学习Brian W. Kernighan和Dennis M. Ritchie的C编程语言时,我尝试了1.9字符阵列中的例子。以下是代码:

/* read a set of text lines and print the longest */

#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */

/* declare functions: getline() and copy() */
int getline(char line[], int maxline); 
void copy(char to[], char from[]);

/* getline: read a line into array "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';  /* the null character whose value is 0 */
    return i;
}

/* copy: copy 'from' into 'to'; assume to is big enough */ 
/* the return type of copy is "void" -- no value is returned */
void copy(char to[], char from[])
{
    int i;
    i = 0;
    while ((to[i] = from[i]) != '\0')  /* terminated with a \0 */
        ++i; 
}

/* print the 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; 
}

有两个主要错误:

  1. 错误:'getline'的冲突类型
  2. 错误:之前的'getline'声明就在这里
  3. 完整的错误列表在这里:

    /Users/C/Codes/Ritchie/array_char.c:8: error: conflicting types for ‘getline’
    /usr/include/stdio.h:449: error: previous declaration of ‘getline’ was here
    /Users/C/Codes/Ritchie/array_char.c:13: error: conflicting types for ‘getline’
    /usr/include/stdio.h:449: error: previous declaration of ‘getline’ was here
    /Users/C/Codes/Ritchie/array_char.c: In function ‘getline’:
    /Users//C/Codes/Ritchie/array_char.c:17: warning: comparison between pointer and integer
    /Users/C/Codes/Ritchie/array_char.c:17: warning: comparison with string literal results in unspecified behavior
    

    我不确定出了什么问题,因为它与本书中的代码完全相同。也许在开头宣布职能:

    int getline(char line[], int maxline); 
    void copy(char to[], char from[]);
    

    有问题吗?谢谢!

4 个答案:

答案 0 :(得分:8)

http://www.kernel.org/doc/man-pages/online/pages/man3/getline.3.html

getline已存在于stdio.h中。这就是你得到错误的原因。将函数名称更改为getline_my等其他内容。

此外,您正在将第16行中的字符与字符串进行比较。它应该是
if(c == '\n')

不是

if(c == "\n")

答案 1 :(得分:4)

问题在于getline中可能存在stdio.h的定义。在我的linux版本中,有一个由C库提供的getline函数(我认为是POSIX标准的一部分)。您不能在C中使用两个具有相同名称的函数,这是您的问题。尝试将您的getline版本重命名为my_getline(您声明/定义它以及使用它的位置)。

答案 2 :(得分:2)

/usr/include/stdio.h:449: error: previous declaration of ‘getline’ was here

正如它所说:getlinestdio.h中声明(因为标准库提供了具有该名称的函数)。您无法使用该名称提供自己的函数,因为当您调用getline时,编译器将不知道要使用哪个函数。

答案 3 :(得分:1)

从编写本书之日起到现在,标准C库修改了一点,它们不再是旧的和新的一致。

您必须删除声明,并保留当前stdio.h中的声明。