내가 만든 라이브러리가 있는데
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에 포함 된 파일에서 : mylib.h : 2 경고 : 함수 선언은 프로토 타입이 아닙니다
나는 사용하고있다 : gcc (GCC) 3.4.5 20051201 (Red Hat 3.4.5-2)
내 질문은 함수 프로토 타입을 선언하는 올바른 방법은 무엇입니까?
답변
C에서 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 표준 이전에는 언어에서 사용 가능한 유일한 함수 선언이었습니다.) 임의의 수의 인수를 사용하여 이러한 함수를 호출 할 수 있으며 컴파일러는 불평 할 필요가 없습니다. call 정의 와 일치하지 않습니다. 프로그램에 정의되지 않은 동작이 있습니다.
하나 이상의 인수를받는 함수의 경우 선언에서 각 인수의 유형을 지정할 수 있습니다.
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 ++는 C (void)
와의 일관성을 위해 구문을 지원합니다 . C와 C ++로 아마도 ()
C ++에서와 C에서 (void)
구문을 사용해야합니다 .)
답변
시험:
extern int testlib(void);