경고/오류 "함수 선언은 프로토타입이 아닙니다"
제가 만든 도서관이 있는데
파일 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
'programing' 카테고리의 다른 글
핸들바.js {{#if}} 조건부 논리 연산자 (0) | 2023.01.13 |
---|---|
현재 날짜의 타임스탬프가 있는 행을 선택하려면 어떻게 해야 합니까? (0) | 2023.01.13 |
개체의 첫 번째 인덱스 가져오기 (0) | 2023.01.13 |
Internet Explorer에 대해 'console'이 정의되지 않은 오류입니다. (0) | 2023.01.13 |
MySQL: int 필드의 값을 전환하는 간단한 방법 (0) | 2023.01.13 |