>백엔드 개발 >C++ >main() 함수가 C에서 자신을 호출할 수 있습니까?

main() 함수가 C에서 자신을 호출할 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-03 00:09:02956검색

Can the main() function call itself in C  ?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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