programing

경고/오류 "함수 선언은 프로토타입이 아닙니다"

goodsources 2023. 1. 13. 19:55
반응형

경고/오류 "함수 선언은 프로토타입이 아닙니다"

제가 만든 도서관이 있는데

파일 mylib.c:

#include <mylib.h>

int
testlib() {
    printf("Hello, World!\n");
    return (0);
}

mylib 파일.h:

#include <stdio.h>
extern int testlib();

프로그램에서 다음 라이브러리 함수를 호출하려고 했습니다.

파일 myprogram.c:

#include <mylib.h>

int
main (int argc, char *argv[]) {
    testlib();
    return (0);
}

이 프로그램을 컴파일하려고 하면 다음 오류가 나타납니다.

myprogram.c:1에서 포함된 파일mylib.h:2 경고: 함수 선언은 프로토타입이 아닙니다.

사용하고 있는 것:gcc (GCC) 3.4.5 20051201 (Red Hat 3.4.5-2)

함수 프로토타입을 선언하는 적절한 방법은 무엇입니까?

주식회사int foo()그리고.int foo(void)는 다른 기능입니다. int foo()는 임의의 수의 인수를 받아들입니다.int foo(void)는 0 인수를 받아들입니다.C++에서는 같은 의미입니다.나는 당신이 다음을 사용할 것을 제안한다.void항상 논쟁하지 않을 때요.

변수가 있는 경우a,extern int a;컴파일러에게 말하는 방법입니다.a는 다른 변환 유닛에 존재할 가능성이 있는 기호입니다(C 컴파일러는 소스 파일을 말합니다).링크 타임까지 해결하지 마십시오.한편, 기능명인 심볼은 링크시에 해결된다.함수에 대한 스토리지 클래스 지정자의 의미(extern,static)는 가시성에만 영향을 줍니다.extern디폴트입니다.extern사실 불필요합니다.

를 삭제할 것을 권장합니다.extern, 관계없고, 통상은 생략됩니다.

빠른 답변: 변경int testlib()로.int testlib(void)함수가 인수를 받지 않도록 지정합니다.

프로토타입은 정의상 함수의 인수 유형을 지정하는 함수 선언입니다.

다음과 같은 비프로토타입 함수 선언

int foo();

는 인수 수나 유형을 지정하지 않는 오래된 형식의 선언입니다(1989년 ANSI C 표준 이전에는 언어에서 사용할 수 있는 유일한 함수 선언이었습니다).이러한 함수는 임의의 수의 인수를 사용하여 호출할 수 있으며 컴파일러는 불평할 필요가 없습니다.그러나 이 정의와 일치하지 않는 경우 프로그램은 정의되지 않은 동작을 합니다.

하나 이상의 인수를 사용하는 함수의 경우 선언에서 각 인수 유형을 지정할 수 있습니다.

int bar(int x, double y);

인수가 없는 함수는 특수한 경우입니다.논리적으로 빈 괄호는 함수가 인수를 받지 않는 것을 지정하는 좋은 방법이었지만 구문은 이미 구식 함수 선언에 사용되고 있었기 때문에 ANSI C 위원회는 다음 명령어를 사용하여 새로운 구문을 발명했습니다.void★★★★★★★★★★★★★★★★★★:

int foo(void); /* foo takes no arguments */

함수 정의(함수가 실제로 수행하는 작업에 대한 코드를 포함)도 선언을 제공합니다.이 경우 다음과 같은 것이 있습니다.

int testlib()
{
    /* code that implements testlib */
}

합니다.testlib에게 「이러다」라고 하는 것을 testlib할 수 은 컴파일러뿐입니다.testlib는 지정되지 않았지만 고정된 인수 수와 유형을 사용합니다.

★★★★★★★★★★를()로로 합니다.(void)선언이 프로토타입이 됩니다.

를 때testlib하나 이상의 인수를 사용하여 컴파일러가 오류를 진단합니다.

(C++로 하다)C++로 하다빈 괄호는 특히 함수가 인수를 받지 않음을 의미합니다.는 C++를 합니다.(void)C c 、 C c 、 C c c c c 。, 하지 않는 한 C++를 해야 .()와 C++ 의 각 부분에서(void)의 )을 참조해 주세요.

시험:

extern int testlib(void);

언급URL : https://stackoverflow.com/questions/42125/warning-error-function-declaration-isnt-a-prototype

반응형