2017-12-01 20 views
-2

MacBook Pro 2017을 가지고 있고 "void main"이라는 프로그램을 컴파일 할 때마다 컴파일러에서 main의 리턴 타입이 INT는 ... 경고는 말한다"main의 리턴 타입은 int가 아닙니다"라는 경고가 MacOS에서 발생했습니다

void main(){ 

(...) 

} 
+2

main의 리턴 타입을 int로 변경하십시오 :'int main() {' – Steve

+0

'main'은'int'를 (호스트 된 환경에서, 어쨌든) 리턴하기로되어 있습니다. 네, 웹상과 몇 권의 책 (좋은 책을 포함하여)에서 무수히 많은'void main()'사례를 보게 될 것입니다 - 엄밀히 말하면 틀린 말입니다. 잘못된 반환 유형을 사용하면 * 정의되지 않은 동작 *이 발생하고 컴파일러는 정의되지 않은 동작에 대한 진단을 내 보내지 않아도됩니다. 그 중 많은 사람들이 지금 그렇게하고 있습니다.하지만 일반적인 오류이기 때문에. –

답변

3

처럼, 당신은 int로 반환 유형을 정의해야합니다

int main() { 
    // bunch of code... 

    return 0; 
} 
0

main()int 값을 반환 할 것으로 예상합니다. 최소한의 시작은 다음과 같습니다

int main() { 
    return 0; 
} 

명령 줄 매개 변수를 받아들이는 형식적인 버전 :

int main(int argc, char** argv) { 
    return 0; 
} 

다른 유형으로 선언이 호환되지 않는 수 있습니다. 구형 컴파일러 중 일부는 상관하지 않지만 Xcode는 그렇지 않습니다.

C는 오랜 시간이었으며 초기부터 상당히 발전했습니다. 이전 참조를 사용하는 경우 실제로 이상한 표기법이나 더 이상 가치가없는 규칙이있는 예제를 찾을 수 있습니다.

3

현재 버전의 C 표준에서는 main 함수의 반환 유형이 int이어야합니다. 따라서 정의를 int main()으로 변경하고 값을 반환해야합니다.

C standard 자세히 호스팅 환경의 제 5.1.2.2.1 다음 상태 : 프로그램 시작시라는

기능이 main 지정됩니다. 구현시이 함수의 프로토 타입이 없음을 선언합니다. 그것은 은 int 리턴 유형없이 파라미터를 정의한다 :

int main(void) { /* ... */ } 

하거나 로컬 임의 이름이 사용될 수 있지만 argcargv 여기 언급 개의 파라미터 (함께 선언 가되는 함수)에 :

int main(int argc, char *argv[]) { /* ... */ } 

또는 동등한 또는 몇몇 다른 구현 정의 방식

.

빈 매개 변수 목록은 매개 변수를 사용하지 않으므로 int main()의 정의가 허용됩니다. 섹션 6.7.6.3에서 :

14 식별자리스트는 함수 파라미터들의 식별자들만을 선언한다. 해당 함수 정의의 일부인 함수 선언자 의 빈 목록은 함수에 매개 변수가 없음을 지정합니다. 함수 선언자 의 빈 목록은 해당 함수 정의의 일부가 아니므로 매개 변수의 수 또는 유형에 대한 정보가 제공되지 않음을 나타냅니다.void main()과 같은 주요 기능을 지정

는 K & R 일에서 미리 표준화 된 변형이고 더 이상 유효하지 않습니다.

+0

'int main()'이'int main (void)'의 유효한 대체물 인 이유에 대한 의견이 있습니까? –

+0

@DavidBowling Done. – dbush

+0

흠. 나는 이것을 생각하고 있었다 : [ "함수 선언자의 빈리스트는 그 함수의 정의의 일부분으로 함수에 매개 변수가 없다는 것을 지정한다."] (http://port70.net/~nsz/c/c11/) n1570.html # 6.7.6.3p14). 이것은 여기에 적용되지 않습니까? –