programing

C에서 함수 프로토타입을 선언해야 합니까?

nicescript 2022. 8. 23. 23:16
반응형

C에서 함수 프로토타입을 선언해야 합니까?

C는 처음입니다(Java, C#, C++ 경험이 있습니다).C에서는 함수 프로토타입을 선언할 필요가 있는가, 아니면 시제품 없이 코드를 컴파일할 수 있는가?그렇게 하는 것이 좋은 프로그래밍 관행입니까?아니면 컴파일러에만 의존합니까?(Ubuntu 9.10을 실행하고 있으며, 다음 코드 하에 GNU C 컴파일러 또는 gcc를 사용하고 있습니다.블록 IDE)

ANSI C(C89 또는 C90을 의미)에서는 함수 프로토타입을 선언할 필요는 없지만 사용하는 것이 좋습니다.표준에서 사용하지 않는 유일한 이유는 매우 오래된 코드와의 하위 호환성을 위해서입니다.

프로토타입을 가지고 있지 않고 함수를 호출하면 컴파일러는 함수에 전달되는 파라미터로부터 프로토타입을 추론합니다.나중에 같은 컴파일 유닛에서 함수를 선언하면 함수의 시그니처가 컴파일러의 예상과 다르면 컴파일 오류가 발생합니다.

게다가 기능이 다른 컴파일 유닛에 있는 경우는, 시제품이 없으면 확인할 수 없기 때문에 컴파일 에러를 얻을 수 없습니다.이 경우 컴파일러가 잘못 알고 있는 경우 함수 호출이 함수가 예상하는 것과 다른 유형을 스택에 푸시하면 정의되지 않은 동작이 발생할 수 있습니다.

규약은 항상 함수를 포함하는 소스 파일과 이름이 같은 헤더 파일에 프로토타입을 선언하는 것입니다.

C99 또는 C11에서는 표준 C가 함수를 호출하기 전에 범위 내의 함수 선언을 요구합니다.많은 컴파일러는 사용자가 강제하지 않는 한 실제로 이 제한을 적용하지 않습니다.

"구" C(C89/90 포함) 또는 새로운 C(C99)에서 기능의 프로토타입을 선언할 필요는 없다.단, 함수 선언에 관해서는 C89/90과 C99 사이에 큰 차이가 있습니다.

C89/90에서는 함수를 선언할 필요가 전혀 없었습니다.되지 않은 을 "이 ""인 합니다.int.

예를들면

int main() {
  int i = foo(5); 
  /* No declaration for `foo`, no prototype for `foo`.
     Will work in C89/90. Assumes `int foo(int)` */

  return 0;
}

int foo(int i) {
  return i;
}

C99 에서는, 콜의 포인트 전에 콜 하는 모든 함수를 선언할 필요가 있습니다.그러나 아직 시제품으로 구체적으로 선언할 필요는 없다.비프로토타입 선언도 기능합니다.이것은 C99에서 "암묵적"이int" 규칙은 더 이상 기능하지 않지만(이 경우 추론된 함수 반환 유형의 경우), 시제품 없이 함수가 선언되어도 파라미터 유형은 인수 유형에서 추측할 수 있습니다.

예는 .C99는 C99이기 때문입니다.foo는 콜 포인트에서 선언되지 않았습니다.할 수 .

int foo(); /* Declares `foo`, but still no prototype */

int main() {
  int i = foo(5); 
  /* No prototype for `foo`, although return type is known. 
     Will work in C99. Assumes `int foo(int)` */

  return 0;
}
...

유효한 C99 코드가 됩니다.

그러나 함수를 호출하기 전에 해당 함수의 프로토타입을 선언하는 것이 항상 좋습니다.

기타 주의사항:위에서 말한 바와 같이 기능 시제품은 신고할 필요가 없습니다.실제로 일부 기능에서는 이것이 필수 조건입니다.C의 바리어스 함수를 올바르게 호출하려면 ( )printf예를 들어) 호출 지점 전에 시제품을 사용하여 함수를 선언해야 합니다.그렇지 않으면 동작은 정의되지 않습니다.이는 C89/90과 C99 모두에 적용됩니다.

필수는 아니지만 시제품을 사용하지 않는 것은 잘못된 관행입니다.

프로토타입을 사용하면 컴파일러는 함수를 올바르게 호출하고 있는지 확인할 수 있습니다(올바른 숫자와 파라미터 유형을 사용).

프로토타입을 사용하지 않으면 다음과 같은 작업이 가능합니다.

// file1.c
void doit(double d)
{
    ....
}

int sum(int a, int b, int c)
{
    return a + b + c;
}

또, 이하와 같이 됩니다.

// file2.c

// In C, this is just a declaration and not a prototype
void doit();
int sum();

int main(int argc, char *argv[])
{
    char idea[] = "use prototypes!";

    // without the prototype, the compiler will pass a char *
    // to a function that expects a double
    doit(idea);

    // and here without a prototype the compiler allows you to
    // call a function that is expecting three argument with just
    // one argument (in the calling function, args b and c will be
    // random junk)
    return sum(argc);
}

함수를 사용하기 전에 정의한 경우에는 필수가 아닙니다.

[ Options ]메뉴를 선택하고 [Compiler | C++ Options]를 선택합니다.표시되는 대화상자의 [Use C++ Compiler]옵션에서 [CPP always]를 선택합니다.다시 '옵션' 메뉴를 선택하고 '환경 | 에디터'를 선택합니다.기본 내선번호가 'CPP'가 아닌 'C'인지 확인하십시오.

C에서는 함수 프로토타입을 선언하지 않고 함수 정의를 사용하면 문제가 없으며 함수의 반환 타입이 "integer"이면 프로그램이 컴파일하여 출력을 생성한다.그 외의 모든 상황에서는 컴파일러 에러가 표시됩니다.그 이유는 함수를 호출하고 함수 프로토타입을 선언하지 않으면 컴파일러는 정수를 반환하는 프로토타입을 생성하고 유사한 함수 정의를 검색하기 때문입니다.기능 프로토타입이 일치하면 성공적으로 컴파일됩니다.반환 유형이 정수가 아니면 함수 프로토타입이 일치하지 않고 오류가 발생합니다.따라서 헤더 파일에 함수 프로토타입을 선언하는 것이 좋습니다.

C는 함수를 선언하지 않아도 호출할 수 있지만, 잘못된 인수를 사용할 경우 컴파일러가 구할 수 있도록 모든 함수의 프로토타입을 선언하는 것을 강력히 권장합니다.

함수 선언은 헤더 파일(X.h)에, 정의는 소스 파일(X.c)에 넣어야 합니다.그러면 다른 파일은#include "X.h"함수 호출을 해 주세요.

에 따르면 기능 프로토타입은 필수 사항이 아닙니다.C99표준.

반드시 호출 코드를 컴파일하기 위해 함수를 선언할 필요는 없습니다.하지만 주의할 점이 있습니다.선언되지 않은 함수는 반환되는 것으로 간주됩니다.int그리고 컴파일러는 먼저 함수가 선언되지 않은 것에 대해 경고를 보내고 그 다음 반환 유형과 파라미터 유형의 불일치에 대해 경고를 보냅니다.

시제품의 기능을 올바르게 선언하는 것이 훨씬 더 좋은 방법이라는 것은 분명합니다.

언급URL : https://stackoverflow.com/questions/2575153/must-declare-function-prototype-in-c

반응형