F.R.I.D.A.Y.

C/C++ 표준 코드(main 함수 표준) 본문

DEV/C C++

C/C++ 표준 코드(main 함수 표준)

F.R.I.D.A.Y. 2019. 3. 25. 09:22
반응형

 C의 main 선언 방식과 C++의 main 선언 방식이 차이가 있다는 얘기를 들었다.

 

// C 타입

int main(void){


    return 0;
}

 

// C++ 타입

int main(){


    return 0;
}

 main 파라미터에 void를 작성하면 C타입, 그렇지 않으면 C++타입이라고 하는데 자세한 출처는 찾아봐야겠다. 문서 하단을 참고하세요.


 

11. ANSI/ISO Standard C

C++ 언어와는 달리, C 언어 표준에서는 main()이 재귀적으로 (즉, recursive하게, main이 다시 main을 부르는 경우) 호출되는 것을 막지 않았습니다.11.5 즉, 원한다면 main에서 다시 main을 부를 수 있습니다. 그러나, IOCCC에 출품할 것이 아니라면, 그런 코드를 만들 이유가 없습니다. (IOCCC에 대한 것은 질문 20.36을 참고하기 바랍니다.) C99 표준에 따르면, (표준에 부합하는 형태, 즉 int를 리턴하는)

cinsk.github.io

 위 항목은 C 표준에 대한 ANSI/ISO 에서 작성한 내용을 다른 분께서 해석한 부분입니다. 들어가면 바로 int main(void)로 작성하는 것이 표준임을 보이고 있습니다.

 

 

주: 프로그램 시작

주: 프로그램 시작main: Program Startup 이 문서의 내용 --> 특수 함수인 main은 모든 C와 C++ 프로그램의 실행 시작 지점입니다.A special function named main is the starting point of execution for all C and C++ programs. 유니코드 프로그래밍 모델을 준수하는 코드를 작성하는 경우 와이드 문자 기반의 main 함수인 wmain을 사용할 수 있습니다.If you

docs.microsoft.com

 위 항목은 C++ 표준에 대한 MS DOCS의 안내입니다. 보시면 int main()으로 작성됨을 알 수 있습니다.


Q. 어째서 void main()로 설명하는 책들이 있나요?

 

 원래는 void main()이라고 작성하게 되면 C언어 표준이 아니므로 프로그램의 진입점을 컴파일러가 찾지 못해 제대로 된 프로그램을 작성할 수 없는 것이 맞습니다. 그러나, 컴파일러 또한 사람들이 만드는 것이고 컴파일러 개발자들이 void main() 또한 프로그램 진입점으로 인정해주어 사용할 수 있다고 보는 것이 맞습니다.

 

 종종 책이나 웹에서 void main()으로 작성하는 분들이 있습니다. 이 분들 또한 void main()이 비표준임을 알고 계실 거라 봅니다. 그러나 표준을 무시한 채 코드 작성 및 설명을 진행하는 이유는 입문자들에게 설명하기에 더 간편하기 때문입니다.

 

 표준 main 함수 코드는 다음과 같습니다.

int main(void){
    
    return 0;
}

 함수의 개념은커녕, 프로그래밍의 개념조차 제대로 잡히지 않은 학생들은 main 앞에 존재하는 int가 무엇인지, return 0;은 무엇을 의미하는지 모릅니다. 함수에 대해 배우게 되면 반환형을 함께 배우게 됩니다. 그럼 이런 의문을 가지게 됩니다.

 

 return 키워드는 함수를 호출한 곳으로 값을 넘겨주는 용도로 사용하는데, main 함수는 프로그램 시작이니 0이라는 값을 어디로 넘겨주는가?

 

 프로그램을 실행하는 주체는 OS이니 OS로 값을 넘겨준다고 하면, OS의 어디에서 이 값을 사용하는지, 0이라는 값의 의미가 무엇인지 등등 질문이 꼬리에 꼬리를 물고 따라오게 됩니다. 이러한 내용은 아직 문법을 배우는 학생들이 관심 가져봐야 큰 의미가 없다는 생각에 void main()을 작성하는 분들이 있기는 합니다. 반환형을 void로 작성하게 되면 return 키워드를 끝에 작성할 필요가 없으니 설명할 것이 줄어드는 이득을 취하는 것이죠.

 

 대체적으로 void main()으로 작성된 코드는 컴파일러가 표준으로 임의로 변경하여 컴파일을 진행합니다. 그러나 이는 C 컴파일러의 필수 구현 대상이 아닌, 이용자의 편의를 위해 개발사에서 임의로 추가한 기능이므로 모든 C 컴파일러가 이 기능을 지원한다고는 할 수 없습니다. 일례로 과거 VS 시리즈에서 void main()으로 컴파일을 진행하면 컴파일 문제를 반환했던 MSVC도 존재했습니다. 곧 번복하여 void main() 또한 허용하도록 수정했지만요.

 

728x90
반응형

'DEV > C C++' 카테고리의 다른 글

변수 초기화  (0) 2019.04.06
부동소수점은 ==으로 비교하지 마세요  (6) 2019.04.05
C언어 프로젝트 생성하기  (0) 2019.03.12
홀수 마방진 풀기  (0) 2019.03.09
시프트 연산자  (2) 2019.01.29
Comments