main() 함수의 재귀: 예상치 못한 컴파일러 동작
main() 함수에 대한 호출은 일반적으로 C에서 허용되지 않습니다. 그러나 실제로는 일부 플랫폼, 특히 g 컴파일러가 있는 Linux 시스템에서는 가능할 수도 있습니다. 이 동작이 어떻게 달성되는지 자세히 살펴보겠습니다.
제공된 코드 예제에서:
<code class="cpp">#include <iostream> #include <cstdlib> int main() { cout << "!!!Hello World!!!" << endl; system("pause"); return main(); }</code>
main() 함수 내에서 main()을 호출하면 무한 루프가 허용됩니다. 그러나 이는 표준 C 동작이 아닙니다.
컴파일러 매직 또는 정의되지 않은 동작?
매직 변수나 매크로를 사용하여 현재 실행 중인 함수를 얻는 것이 가능한가요? 아니요, C 표준에는 그러한 조항이 없습니다.
Linux 컴파일러 예외
표준의 금지에도 불구하고 Linux g 컴파일러는 내부에서 main() 호출을 사용하여 코드를 컴파일합니다. main() 오류를 발생시키지 않고. 이는 C 표준에 대한 컴파일러의 관대한 해석 때문입니다.
실제 데모
다음 코드를 고려하세요.
<code class="cpp">#include <cstdlib> #include <iostream> using namespace std; int main() { int y = rand() % 10; // returns 3, then 6, then 7 cout << "y = " << y << endl; return (y == 7) ? 0 : main(); }</code>
다음 코드를 사용하여 컴파일할 때 g 에서 이 코드는 다음과 같은 어셈블리 코드를 생성합니다.
<code class="assembly">main: ... cmpl , -12(%rbp) je .L7 call main ... .L7: ... leave ret</code>
이 어셈블리 코드에서 main은 다른 함수와 마찬가지로 호출됩니다. main() 함수에서 main() 호출은 일반 함수 호출로 변환됩니다.
결론
main() 내에서 main()을 호출하는 동안 C 표준에서는 허용되지 않지만 이러한 동작을 허용하는 특정 컴파일러가 있는 특정 플랫폼에서는 그렇게 하는 것이 가능할 수도 있습니다. 하지만 이는 표준 C가 아니며 다른 환경이나 컴파일러 버전에서는 예상치 못한 결과가 발생할 수 있다는 점을 강조하는 것이 중요합니다.
위 내용은 main() 함수가 C에서 자신을 호출할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!