codememo

K&R2 1장에서 가장 긴 줄 예제를 컴파일할 때 "etline 유형 충돌" 오류가 발생하는 이유는 무엇입니까?

tipmemo 2023. 6. 7. 22:55
반응형

K&R2 1장에서 가장 긴 줄 예제를 컴파일할 때 "etline 유형 충돌" 오류가 발생하는 이유는 무엇입니까?

여기 제가 "C 프로그래밍 언어" 섹션 1.9에서 바로 실행하려고 하는 프로그램이 있습니다.

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

다음은 Ubuntu 11.10을 사용하여 프로그램을 컴파일하려고 할 때 발생하는 오류입니다.

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 등을 실행하려고 할 때 비슷한 오류가 발생합니다.프로그램을 실행하여 프로그램이 어떻게 출력되는지 확인할 수 없을 때 배우는 것은 정말 어렵습니다.이 문제는 하나의 프로그램에 문자 배열과 함수 호출을 도입할 때 시작되었습니다.이 문제에 대한 조언을 해주시면 감사하겠습니다.

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

해결책은 단순히 이름을 바꾸는 것입니다.

충돌하는 함수는 GNU/POSIX 확장입니다.

K&R은 ANSIC를 그들의 책(c.f.)에서 구체적으로 다루고 있으며, 이 기능을 제공하지 않는다고 명시하고 있습니다.

저자들은 ANSI 표준 C 언어 프로그래밍에 대한 전체 가이드를 제시합니다.

gcc를 "K&R 호환성 모드"로 설정하려면 컴파일을 위한 ANSI 또는 ISO 모드를 지정할 수 있습니다.이들은 확장 기능(예: 기능)을 비활성화하기 위한 것입니다.getline()이는 결국 K&R에서 제공하는 다른 예제를 편집할 필요성을 없앨 수 있습니다.

예를 들어, 다음 컴파일은 문제가 없습니다.

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

(의 암묵적인 기본 반환 유형에 대해 불평하는 경우 제외)main()와 함께-Wall.)

일부 시스템에서는 이러한 모드가 여기에 제시된 대로 작동하지 않을 수 있습니다(Mac OS 일부 버전에서는 모든 확장을 올바르게 비활성화하지 못합니다).나는 이것을 내 기계에서 성공적으로 테스트했습니다.

$ 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.

그 이유는stdio.h을 보다getline()기능.

따라서 이 작업을 수행하는 간단한 방법은 함수의 이름을 다음과 같이 변경하는 것입니다.my_getline()

둘다요.getline()그리고.getdelim()원래는GNU내선 번호그들은 표준화되었습니다.POSIX.1-2008.

/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[])

getline 이에선된함다수니입언제▁in에서 선언된 입니다.stdio.h

이름 getline다른 이름으로 함수를 지정하면 컴파일됩니다.

getline 이름이 이미 존재하기 때문에 변경해야 합니다.

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

언급URL : https://stackoverflow.com/questions/8763052/why-do-i-get-a-conflicting-types-for-getline-error-when-compiling-the-longest

반응형