함수 선언은 프로토 타입이 아닙니다


158

내가 만든 라이브러리가 있는데

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)

내 질문은 함수 프로토 타입을 선언하는 올바른 방법은 무엇입니까?


1
mylib.h의 선언에서 extern을 제거하십시오. 특히 순수한 C 프로그램을 작성하는 경우 extern 선언이 필요하지 않습니다.
Ryan Ahearn

답변:


333

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. 외부 적이며 일반적으로 생략됩니다.


9
함수가 인수를 취하지 않음을 나타내려면 (void) C 에서 사용하십시오 . C ++에서 C와 C ++로 컴파일하기 위해 코드가 특별히 필요한 경우가 아니면을 사용하십시오 ().
Keith Thompson

49

빠른 대답 : 변화 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)구문을 사용해야합니다 .)


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.