2011-02-22 6 views
3

가능한 중복 :
Must declare function prototype in C?C에서 함수를 선언해야합니까?

내가 C를 배우고 그리고 책에 내가 코드의이 재미있는 이야기를 읽고 있어요는 void scalarMultiply(int nRows, int nCols, int matrix[nRows][nCols], int scalar);의 문이있다. 이 줄을 포함하지 않아도 프로그램이 작동하는 것 같습니다.

int main(void) 
    { 

     void scalarMultiply(int nRows, int nCols, int matrix[nRows][nCols], int scalar); 
     void displayMatrix(int nRows, int nCols, int matrix[nRows][nCols]); 
    int sampleMatrix[3][5] = { 
     { 7, 16, 55, 13, 12}, 
     { 12, 10, 52, 0, 7 }, 
     { -2, 1, 2, 4, 9 } 

    }; 

    scalarMultiply(3, 5, sampleMatrix, 2); 


} void scalarMultiply(int nRows, int nCols, int matrix[nRows][nCols], int scalar){ 
     int row, column; 

     for (row = 0; row < nRows; ++row) 
      for (column = 0; column < nCols; ++column) 
       matrix[row][column] *= scalar; 

    } 
+0

잘 알고 있습니다. 감사. – steve

+2

[C에서 함수 프로토 타입을 선언해야 함] (http://stackoverflow.com/questions/2575153/must-declare-function-prototype-in-c) [나는 특히 AndreyT의 대답을 추천합니다] –

+1

제목은 C, 질문이라고 말합니다. C는 태그에 C++이 있다고 말합니다. 왜? – GManNickG

답변

0

정의되기 전에 함수를 호출하려면 프로토 타입을 선언해야합니다. 그렇지 않으면 아니오. 이 때문에 많은 C 프로그램이 하단에 main으로 작성되고 상단에는 작은 도우미 기능이 있습니다. 컴파일 유닛 내에서 함수 프로토 타입을 정말로 필요로하는 유일한 시간은 상호 재귀입니다.

+0

@David : 무엇을 다시 고려합니까? 나는 어딘가에서 불분명 했는가? – nmichaels

+0

@David : C++에 대해서는 잘 모르겠지만 선언되기 전에 함수를 사용하면 C99 컴파일러가 불평 할 것입니다. – nmichaels

1

함수를 사용하기 전에 선언하지 않으면 컴파일러가 함수의 서명을 추측하려고 시도 할 수 있습니다. 어쨌든

기능 짐작 컴파일러는 실제 기능이 다른 경우 당신은 매우 이상한 결과를 얻을 수 있습니다 : 예를 들어 당신이 scalarMultiply, 그것은, int로 변환되지 않습니다이 뜻에 첫 번째 매개 변수로 long long을 전달하는 경우 정의되지 않은 동작이 발생합니다 : 스택을 손상시킬 가능성이 높습니다 (함수가 매개 변수를 사용자가 의미하는 다른 방식으로 읽음) 모든 것이 폭발합니다.


봐 :

#include <stdio.h> 
int main() { 
    f((long long int) -1); 
    g(1, 1); 
    return 0; 
} 
void f(int a, int b) { 
    printf("%d, %d\n", a, b); 
} 
void g(long long int a) { 
    printf("%lld\n", a); 
} 

출력 될 것입니다 :

-1, -1 
4294967297 

이상한, 어?

0

기존 C 컴파일러에서는 프로토 타입 작성 및 함수 호출이 필요하지 않으며 호출 및 이후 선언이 충돌하지 않는 한 나중에 선언 할 수 있습니다. 이것은 C++에는 해당되지 않습니다.

경고 : 잠시 동안 C 전용 모듈을 작성하지 않았으므로 gcc의 최신 버전이 .c 파일의 경우 어떤 작업을 수행하는지 알지 못합니다.

0

정의 또는 프로토 타입을 사용할 수없는 함수 호출이 발생할 때 C89의 필수 동작은 int를 반환하고 사용자가 호출에서 제공 한 인수의 수와 유형을 가지고 있다고 가정하는 것입니다. 합법적으로 암시 적으로 캐스트 할 수없는 다른 인수 유형 또는 다른 수의 인수로 후속 호출하는 경우 컴파일러는 코드를 거부합니다.

컴파일러 또는 링커는 결국 일치하지 않는 정의를 찾으면 불평합니다. 프로토 타입을 사용하면 컴파일러는 정의가 아닌 호출시 오류를 생성 할 수 있으며 다른 모듈의 정의를 연결하려고 할 때 오류를 생성 할 수 있습니다. 따라서 컴파일러에서 작업 코드를 작성하는 데 도움을주기를 원하면 간단히하지 마십시오!

C99 및 C++ 프로토 타입은 정의가 아직 표시되어 있지 않은 경우 필요합니다.

+0

C99에는 선언이 필요하지만 프로토 타입은 필요하지 않습니다. 정의가 요구 사항을 충족시킵니다. –

+0

@R : 그것이 "정의가 아직 보이지 않았다면"이라는 의미였습니다. – Clifford

+0

요점은 프로토 타입이 필요 없다는 것이 었습니다. 프로토 타입이 아닌 선언이 허용됩니다. –

관련 문제