2017-03-15 9 views
-1

C에 전달 선언 기능이없는 다음 프로그램을 컴파일했습니다. 경고 또는 오류없이 성공적으로 컴파일되어 GCC에 실행됩니다.C++에서 전달 선언이 누락 된 문제

#include <stdio.h> 

int main() 
{ 
     int ret = func(10, 5); 
} 

int func(int i, int j) 
{ 
     return (i+j); 
} 

그러나, 나는 앞으로 C++에 기능을 선언하지 않고 프로그램 다음 컴파일은 컴파일러 나에게 오류를 제공합니다.

#include <iostream> 
using namespace std; 

int main() 
{ 
     int ret = func(10, 5); 
} 

int func(int i, int j) 
{ 
     return (i+j); 
} 

있는 오류 :

fl.cpp:6:22: error: ‘func’ was not declared in this scope 
    int ret = func(10, 5); 
        ^

왜 C++ 컴파일러는 오류를 준다? 기본적으로 int 데이터 형식을 사용하지 않습니까?

+10

, 더 이상 C에서 99는 – StoryTeller

+1

* 이후 : 표준 그렇게 말한다 때문입니다. –

+1

@CraigYoung이 기능을 사용하기 전에 "더 FWD 자명 한 일 입니 ..." –

답변

3

글쎄, C++ 에서처럼 C에서 만큼은 잘못되었습니다. 질문을 고려

"가정"을 기반으로 코드 뷰의 C 컴파일러 관점에서 유효 함을가, 나 사양 (C11)에 따라, 그 정교한하자, 함수의 암시 적 선언은 아니다 허용. C. C11, 머리말/P7을, 두 번째 판에서 "주요 변경 사항이 포함 인용

See live example

에서 같은 오류가 발생합니다 엄격한 준수 (있는 준수) 컴파일러를 사용하여 코드를 컴파일 : "

  • remove implicit function declaration

동일한는 또한 C99 존재한다.


참고 :이 코드가 성공적으로 컴파일하는 것이 사전 C99

을 일한 이유에 는, 실제로 방에 있었다. 함수 프로토 타입이 누락 된 경우 함수는 int을 반환하고 입력으로 매개 변수의 수를 허용한다고 가정합니다. 이것은 매우 비표준이며 레거시 지원을 가진 컴파일러는 그러한 코드를 컴파일하도록 허용 할 수 있습니다. 그러나 엄격하게 말하면, 준수 컴파일러는이를 거부해야합니다.

+0

C99 이상의 컴파일러는 코드를 거부합니다. 1999 년 이전의 컴파일러 또는 "C89"모드 (예 :'gcc -stdc89')의 컴파일러는 일반적으로 C99를 준수하지 않습니다. – Peter

+0

@ 피터 때때로 당신이 옵션을 사용하여 "준수"를 적용 할 필요가있다, 그것은 기본적으로이 아니다 ... 그건 내가 무슨 얘기 전부 '. –

1

Why C++ Compiler Gives an Error?

C++에서 선언되지 않은 함수를 호출하면 안됩니다.

Is it not by default take int data type?

아니요. 다른 언어 C의 경우입니다. C++에는 해당하지 않습니다.

0

C++에서는 선언되지 않은 함수를 호출 할 수 없습니다. C에서 함수의 정의가 int를 리턴하면 forward 선언자없이 함수를 호출 할 수 있습니다. 이것은 이전 K & R 함수 정의 스타일 때문입니다. 이것은 ANSI-C에서 쓸모 없으며 항상 프로토 타입이있는 함수를 선언합니다.

+0

이것은 약간 정확하고 대개는 매우 잘못되었습니다. 선언되지 않은 함수가 발견되면 C 컴파일러는 선언을 가정합니다 (구현이 없으면 링커에서 불평합니다). 선언 또는 구현이 나중에 코드, – parvus

+0

에서 발견되고 가정하에 일치하지 않을 때 가정, 즉 거짓 인 경우, 컴파일러 오류가 주어진다. 컴파일러 버전 및 컴파일러 플래그의 영향을받을 수 있습니다. 지금까지 최고의 조언은 :하지 마라. 항상 앞을 선언합니다. – parvus

+0

@parvus, 그렇습니다. C 컴파일러는 선언을 가정합니다. 이 함수 선언자이 매개 변수가없는 및 ​​함수가 int를 반환하는 경우, 선언이 아니라 생략되었을 수도 이전 K & R C 함수 스타일의 유산이다. –

1

그림을 완성하고 답변과 관련하여 Sourav Ghosh.다음은 C++ 표준이 문제에 대해 말해야하는 내용은 다음과 같습니다

[expr.call] p2 :

[ Note: If a function or member function name is used, and name lookup does not find a declaration of that name, the program is ill-formed. No function is implicitly declared by such a call.  — end note ]

그 이상 명시 적으로 가져올 수 없습니다. 평소와 같이 * "? C++ 컴파일러는 오류를 제공하는 이유"결코 C++에서