2014-12-20 3 views
-1

함수 프로토 타입에 대해 언급하지 않은 경우 main에서 함수를 호출하고 main 뒤에 정의를 작성하면 오류가 발생합니다. main 앞에 함수 정의를 쓰고 프로토 타입을 작성하지 않으면 프로그램이 작동합니다 벌금. 그래서 내 질문에 우리가 main (프로토 타입을 쓰지 않고) 전에 함수 정의를 쓰면 함수 프로토 타입을 선언하지 않는 문제를 해결할 수 있는가? (즉, 컴파일러는 위에서 아래로 읽기 시작하고 여전히 함수 이름, 반환 유형, 매개 변수 등)함수 프로토 타입/정의

+0

함수 정의는 전에 선언되지 않은 경우 함수의 선언을 포함합니다. –

+2

또한 C와 C++ 사이에서 이전에 선언되지 않은 함수가 다른 경우 어떻게됩니까? C와 C++에는 약간의 유사성이 있지만 실제로는 매우 다른 의미 론적 규칙을 가진 매우 다른 언어입니다. 앞으로 확실한 답을 원하면 언어 하나를 선택하십시오. –

+0

나는 C와 C++이이 점에서 매우 다르다고 생각한다. 어떤 것을 사용하고 있거나 어떤 종류의 호환성을 목표로 지정해야합니다. –

답변

0

이전 프로토 타입이없는 함수 정의는 함수 정의 직전에 프로토 타입 선언과 의미 상 동일합니다. 그래서 예, 안전합니다 : 함수를 사용하기 전에 프로토 타입없이 함수를 정의하면 정상적으로 작동합니다.

0

컴파일러는 해당 함수를 호출 할 때 함수 정의로 이동합니다. 함수 프로토 타입은 인수와 반환 형식 검사를 위해 참조됩니다. 그래서, 안전하게 함수 프로토 타입을 방출 할 수 있습니다 ...

0

예 (for C++)에서는 컴파일러가이를 수락합니다. 함수 컴파일러를 호출하기 전에 먼저 프로토 타입 또는 정의를 확인해야합니다. 또한 번역 단위 (cpp) 파일은 위에서 아래로 컴파일되므로

void foo(); 
void foo2() { 
} 

int main() { 
    foo(); 
    foo2(); 
} 

void foo() { 
} 

모두 정확합니다. main() 아래에 foo을 정의하지 않고 foo() 프로토 타입을 제공하면 컴파일러는 여전히 코드를 허용하지만 링커는 오류를 발생시킵니다.

+0

@ Marcin Jedrzejewski 우리가 void foo()를 프로토 타입으로 작성하고 main에서이 함수를 호출하고 main 아래 함수를 정의하지 않으면 컴파일러에서 foo()에 대한 정의되지 않은 참조를 제공합니까? – Rooney10

+0

@ Rooney10 예. 실제로 오류를 발생시키는 링커가 있는데, 컴파일은 두 단계로 이루어져 있습니다. 먼저 모든 번역 단위가 컴파일되고 모든 결과 객체 파일이 링크됩니다. 컴파일러는 foo()를 정의한 곳을 인식하지 못하기 때문에 다른 번역 단위 (.cpp 파일)에서 정의 할 수 있습니다. – marcinj