2012-01-06 1 views
30

"The C Programming Language"섹션 1.9에서 곧바로 실행하려고하는 프로그램이 있습니다. 나는 우분투 11.10를 사용하여 프로그램을 컴파일 할 때 여기 K & R2 1 장에서 가장 긴 행 예제를 컴파일 할 때 "getline에 대해 충돌하는 유형"오류가 발생하는 이유는 무엇입니까?

#include <stdio.h> 
#define MAXLINE 1000 

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

main() 
{ 
    int len; 
    int max; 
    char line[MAXLINE]; 
    char longest[MAXLINE]; 

    max = 0; 
    while ((len = getline(line, MAXLINE)) > 0) 
     if (len > max) { 
     max = len; 
     copy(longest, line); 
     } 
    if (max > 0) 
     printf("%s", longest); 
return 0; 
} 


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; 
} 


void copy(char to[], char from[]) 
{ 
    int i; 

    i = 0; 
    while ((to[i] = from[i]) != '\0') 
     ++i; 
} 

은 내가 오류입니다 :

cc  word.c -o word 
word.c:4:5: error: conflicting types for ‘getline’ 
/usr/include/stdio.h:671:20: note: previous declaration of ‘getline’ was here 
word.c:26:5: error: conflicting types for ‘getline’ 
/usr/include/stdio.h:671:20: note: previous declaration of ‘getline’ was here 
make: *** [word] Error 1 

그냥 확인이 책의 인쇄에 문제가 아니었다 만들을, 나는 참조 이 장의 뒷부분에 나오는 답변 세트 (http://users.powernet.co.uk/eton/kandr2/krx1.html)와 연습 문제 18, 19, 20을 실행하려고하면 비슷한 오류가 발생합니다. , 21, 등등. 프로그램을 실행하여 출력하는 방법을 알 수 없을 때 배울 수 없습니다. 이 문제는 문자 배열과 함수 호출을 하나의 프로그램에 도입 할 때 시작되었습니다. 이 문제에 대한 조언을 주시면 감사하겠습니다.

답변

28

문제는 getline()이 표준 라이브러리 기능입니다. (stdio.h에 정의 됨) 함수의 이름이 같으므로 함수와 충돌합니다.

해결 방법은 단순히 이름을 변경하는 것입니다.

+4

낭비 20 분. google 그냥 –

+0

하 하하 나도 @ dmtri.com – samrap

+1

** getline() ** ** ** 표준 라이브러리 함수가 아니라, 그것은 @moooeeeep 더 깊이와 또한 여기에 http : //Dackerup.asp에 의해 /standackflow.com/questions/7376566/can-an-ans-c-compliant-implementation-include-additional-functions-in-stand-stand 따라서 오늘 코딩을한다면'getline()'을 사용하지 말아야한다. 그러나 이미 자체 구현 된'getline()'함수를 사용하는 라이브러리에 의존한다면 어떻게 될까? 광범위한 의미에서 @ moooeeeep의 대답이 더 적절하다고 생각합니다. –

2

이미 존재하므로 getline의 이름을 변경해야합니다. 당신에게 힌트를 제공한다

+0

@downvoter : reason? – BlackBear

+0

나는이 문제에서 설명한 동일한 문제를 가지고 있었다. 나는'getline()'이 실제로 표준 라이브러리에서 정의 되었는지를 확인하기 위해 C 참조를 찾아 보았지만 찾지 못했습니다. 더 혼란 스럽습니다. 여기서 도움이되는 대답은'getline()'이 _POSIX_ Standard C Library에 정의되어 있다는 것입니다. 단순히 '이미 존재합니다'라는 말은 혼란스럽고 아마도 부정확합니다. –

+0

@IsaacKleinman @ IsaacKleinman 필자의 대답은 정확하지 않지만, 여전히 정확하다 : 받아 들인 대답에서 인용하기 "getline()은 표준 라이브러리 함수이다. (stdio.h에 정의 됨)" – BlackBear

3

/usr/include/stdio.h:671:20: note: previous declaration of ‘getline’ was here

. 코드에서 getline() 함수의 이름을 바꾸어 시도하십시오.

또한 main()을 이렇게 선언하는 것은 구식입니다. 선언 된 반환 형식과 인수가없는 함수는 기본적으로 불특정 다수의 인수를 받아들이고 int를 반환합니다. main()의 경우는 거의 같습니다. int를 반환하지만 두 개의 인수가 있습니다.

int main(int argc, char **argv) 

나 : 당신은 더 나은로 선언했다

int main(int argc, char *argv[]) 
+1

이것은 C99에서만 사용되지 않습니다. 구식 함수 정의는 K & R (에디션 2)의 마지막 판에서'main' 함수로 사용됩니다. – ouah

+0

정말요? 나는 그것이 최초의 ANSI C 스펙만큼 오랫동안 사용되지 않았다고 생각했다 ... – fge

+0

어쨌든 - 주석 편집 – fge

7

이있는 stdio.hgetline() 기능을 가지고 있기 때문이다.

그래서이 작품을 만들 수있는 간단한 일이 원래 GNU 확장했다 my_getline()

모두 getline()getdelim()에 함수 이름을 변경하는 것입니다. 그들은 POSIX.1-2008으로 표준화되었습니다.

+0

이것은 올바른 대답이다. 문제를 해결하는 방법이 아니라 전문가가 책을 쓰면 실패하는 이유는 무엇입니까? "getline이 아직 표준화되지 않았을 때이 책이 쓰여졌 기 때문에." 아, 고마워. – mimoralea

+0

@mikiemorales이 책은 다른 표준을 준수하여 작성되었습니다. 내 대답보기 : http://stackoverflow.com/a/17378451/1025391 – moooeeeep

2

getline 다른 이름으로 당신에게 getline 기능의 이름을 변경하고 컴파일 지금 stdio.h

에서 선언 된 POSIX 함수이다.

1

이미 "stdio.h"파일에 정의 된 getline이라는 함수입니다. 따라서 프로토 타입의 충돌! 함수의 이름을 "my_getline"또는 다른 이름으로 바꾸면됩니다.

27

충돌 함수 getline()은 GNU/POSIX 확장입니다.

K & R은 자신의 책 (c.f.)에서 ANSI C를 구체적으로 처리하며이 기능은이 기능을 제공하지 않습니다.

저자는 ANSI 표준 C 언어 프로그래밍에 대한 전체 안내서를 제공합니다.

gcc를 "K & R 호환 모드"로 설정하려면 컴파일을 위해 ANSI 또는 ISO 모드를 지정할 수 있습니다. 확장 기능을 사용하지 않으려는 목적입니다 (예 : getline()). 결국 K & R이 제공하는 다른 예제를 편집 할 필요가 없어 질 수 있습니다.

예를 들어, 다음 잘 컴파일 :

$ gcc test.c -ansi 
$ gcc test.c -std=c89 

(. 그들은 -Wallmain()의 암시 적 기본 반환 형식에 대해 불평하는 것을 제외) 일부 시스템 Apparantly 히

,이 모드는하지 않을 수 있습니다 여기에 제시된대로 작업하십시오 (apparantly some version(s) of Mac OS fail to correctly disable all extensions). 나는 내 컴퓨터에서 이것을 성공적으로 테스트했다 :

$ gcc --version 
gcc (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8) 
Copyright (C) 2012 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
+0

나는'gcc test.c -ansi'를 시도했다. 그것은 작동하지 않는 것 같습니다. – Jack

+0

@Jack 어떤 OS/- 버전을 시도 했습니까? – moooeeeep

+0

저는 macOS Sierra Version 10.12.5를 사용합니다. 이 OS에서'gcc test.c -ansi'를 대체 할 수 있습니까? – Jack