>  기사  >  php教程  >  C 언어의 void main()에 대하여

C 언어의 void main()에 대하여

高洛峰
高洛峰원래의
2016-12-13 13:26:511234검색

많은 사람들, 심지어 시중에 나와 있는 일부 책에서도 void main()을 사용하는데 이는 실제로 잘못된 것입니다. void main( )은 C/C++에서 정의된 적이 없습니다. C++의 아버지인 Bjarne Stroustrup은 자신의 홈페이지 FAQ에서 void main( ) { /* ... */ } 정의는 C++가 아니며 C++였던 적도 없고 심지어 C였던 적도 없다고 분명히 밝혔습니다. ( )는 C++이나 C에는 존재하지 않았습니다. C와 C++ 표준에서 각각 main 함수의 정의에 대해 이야기하겠습니다.

1. C 언어의 Main()

C89에서는 main()이 허용됩니다. Brian W. Kernighan과 Dennis M. Ritchie의 고전 걸작 C 프로그래밍 언어 2e("C 프로그래밍 언어 2판")에서는 main()을 사용합니다. 그러나 최신 C99 표준에서는 다음 두 가지 정의만 정확합니다.

int main(void)

int main(int argc, char *argv[])

 (참고: ISO/IEC 9899:1999 (E) 프로그래밍 언어 ​​? C 5.1.2.2.1 프로그램 시작)

물론 약간의 변경도 가능합니다. 예를 들어, char *argv[]는 char **argv로 작성할 수 있으며 argc는 다른 변수 이름(예: intval 및 charval)으로 변경할 수 있지만 변수 명명 규칙을 준수해야 합니다.

명령줄에서 매개변수를 가져올 필요가 없으면 int main(void)를 사용하고, 그렇지 않으면 int main(int argc, char *argv[])를 사용하세요.

반환 값이 프로그램 호출자(예: 운영 체제)에 전달될 수 있도록 주 함수의 반환 값 유형은 int여야 합니다.

main 함수 끝에 return 문이 없으면 C99에서는 컴파일러가 생성된 대상 파일(예: exe 파일)에 return 0을 자동으로 추가해야 프로그램이 정상적으로 종료됨을 나타냅니다. . 하지만, 꼭 필요하지는 않더라도 return 문을 main 함수 끝에 추가하는 것이 좋습니다. vc6은 대상 파일에 return 0을 추가하지 않습니다. 이는 아마도 vc6이 1998년 제품이었기 때문에 이 기능을 지원하지 않기 때문일 것입니다. 이제 왜 반환문을 추가하라고 제안하는지 이해하셨을 것입니다! 그러나 gcc3.2(Linux의 C 컴파일러)는 생성된 개체 파일에 return 0을 추가합니다.

2. C++의 Main()

C++98에서는 main 함수를 정의하는 다음 두 가지 방법을 정의합니다.

int main( )

int main(int argc, char *argv[])

참조: ISO/IEC 14882(1998-9-01) 프로그래밍 언어 C++ 3.6 시작 및 종료

int main()은 C99의 int main(void)와 동일합니다. int main(int argc, char *argv[])의 사용법도 C99에 정의된 것과 동일합니다. 마찬가지로, 주 함수의 반환 값 유형도 int여야 합니다. main 함수 끝에 return 문이 없는 경우 C++98에서는 컴파일러가 생성된 개체 파일에 return 0을 자동으로 추가해야 한다고 규정합니다. 마찬가지로 vc6은 이 기능을 지원하지 않지만 g++3.2(Linux의 C++ 컴파일러)는 지원합니다.

3. void main()에 대하여

C 및 C++에서 매개변수를 받지 않고 정보를 반환하지 않는 함수의 프로토타입은 "void foo(void );". 아마도 이 때문에 많은 사람들은 프로그램이 값을 반환할 필요가 없으면 메인 함수를 void main(void)으로 정의할 수 있다고 잘못 믿고 있습니다. 하지만 이건 틀렸어! main 함수의 반환 값은 C, C++ 표준에 규정된 int 형식으로 정의해야 합니다. void main은 일부 컴파일러(예: vc6)에서 컴파일될 수 있지만 void main은 표준에 정의된 적이 없기 때문에 모든 컴파일러가 void main을 지원하는 것은 아닙니다. g++3.2에서는 main 함수의 반환 값이 int 유형이 아닌 경우 컴파일을 전혀 통과하지 못합니다. gcc3.2는 경고를 발행합니다. 따라서 프로그램의 이식성을 높이려면 int main을 사용해야 합니다.

“선생님이 저한테 그게 옳은 일이라고 하셨어요”라고 변명하지 마세요. 선생님은 잘못하는 나쁜 습관이 있습니다. 안전하고 표준을 준수하는 코드를 작성함으로써 모든 사람은 표준적인 작업에 시간을 낭비하는 대신 프로그램의 다른 문제에 집중할 수 있습니다.

일부 시스템에서는 프로그램이 void 기본 정의를 사용하거나 반환 값이 없으면 스택 예외가 발생하고 시스템 오류가 발생할 수 있다는 점을 지적해야 합니다. (자세한 내용은 아래 영문부분 참조)

4. 반환값의 기능

main 함수의 반환 값은 프로그램의 종료 상태를 나타내는 데 사용됩니다. 0이 반환되면 프로그램이 정상적으로 종료된다는 의미입니다. 반환된 다른 숫자의 의미는 시스템에 의해 결정됩니다. 일반적으로 0이 아닌 반환은 프로그램이 비정상적으로 종료되었음을 나타냅니다. winxp 환경에서 작은 실험을 해보자. 먼저 다음 프로그램을 컴파일하십시오.

int main(void)

{

return 0;

}

그런 다음 첨부 파일을 엽니다. "명령 프롬프트", 명령줄에서 방금 컴파일한 실행 파일을 실행한 다음 "echo %ERRORLEVEL%"를 입력하고 Enter 키를 누르면 프로그램의 반환 값이 0인 것을 확인할 수 있습니다. 방금 컴파일한 파일이 a.exe라고 가정합니다. "a && dir"을 입력하면 현재 디렉터리의 폴더와 파일이 나열됩니다. 그러나 이를 "return -1" 또는 0이 아닌 다른 값으로 변경하고 다시 컴파일한 후 "a && dir"을 입력하면 dir이 실행되지 않습니다. &&의 의미는 && 이전 프로그램이 정상적으로 종료되면 && 이후 프로그램이 계속 실행되고 그렇지 않으면 실행되지 않는다는 것입니다. 즉, 프로그램의 반환값을 이용하여 다음 프로그램의 실행 여부를 제어할 수 있다. 이것이 int main의 장점입니다. 관심이 있는 경우 기본 함수의 반환 값 유형을 int가 아닌 유형(예: float)으로 변경하고 "a && dir"을 다시 컴파일하고 실행하여 무슨 일이 일어나는지 확인하고 왜 그런 일이 일어나는지 생각해 볼 수도 있습니다. 그런데 || dir을 입력하면 a가 비정상적으로 종료되면 dir이 실행된다는 의미입니다.

5. int main(int argc, char *argv[], char *envp[])는 어떻습니까?

물론 이것은 표준 C/C++에 정의된 것이 아닙니다! char *envp[]는 시스템 환경 변수를 얻기 위해 일부 컴파일러에서 제공하는 확장 함수입니다. 이는 표준이 아니기 때문에 모든 컴파일러가 이를 지원하는 것은 아니므로 이식성이 좋지 않으며 권장되지 않습니다. 프로그램이 특정 환경에서 작동하도록 특별히 설계되어 시스템의 환경 변수를 얻어야 하는 경우가 아니면 말입니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:C/C++의 void 및 void*다음 기사:C/C++의 void 및 void*