문제

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

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

이 프로그램을 컴파일하려고 하면 다음 오류가 발생합니다.

In file included from myprogram.c:1
mylib.h:2 warning: function declaration isn't a prototype

나는 다음을 사용하고 있습니다 : 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 표준 이전에는 이것이 언어에서 사용할 수 있는 유일한 종류의 함수 선언이었습니다.) 임의 개수의 인수를 사용하여 이러한 함수를 호출할 수 있으며 컴파일러는 불평할 필요가 없습니다. 통화 내용이 일치하지 않습니다. 정의, 프로그램에 정의되지 않은 동작이 있습니다.

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

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++에서는 (void) C의 구문)

노력하다:

extern int testlib(void);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top