Подтвердить что ты не робот

Вызовите main() непосредственно в С++?

#include <iostream>
#include <cstdlib>

int main() {
    cout << "!!!Hello World!!!" << endl;
    system("pause");
    return main();
}

Вышеописанное работает, но оно жестко закодировано функцией main(). Есть ли волшебная переменная или макрос для получения текущей запущенной функции?

4b9b3361

Ответ 1

Стандарт С++ говорит, что вы не можете вызывать main() из своего собственного кода. Что касается получения имени текущей функции, вы можете использовать макрос __FUNCTION__, но в очередной раз это не стандартно:

#include <iostream>
using namespace std;

void foo() {
   cout << __FUNCTION__ << endl;
}

int main() {
   foo();
}

должен печатать "foo" или что-то подобное, если поддерживается __FUNCTION__.

Ответ 2

Разрешено ли в "С++"? Нет.

На практике вы можете называть main()? Да.

Независимо от того, что говорит С++ Standard, это не мешает компилятору Linux g++ компилировать код с main() в main().

#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();
}

Что позволяет:

 > g++ g.cpp; ./a.out
 y = 3
 y = 6
 y = 7

Посмотрев на сборку, мы видим, что main вызывается так же, как любая другая функция:

main:
        ...
        cmpl    $7, -12(%rbp)
        je      .L7
        call    main
        ...
.L7:
        ...
        leave
        ret

Не то, чтобы это поведение было гарантировано, но похоже, что g++, похоже, действительно не заботится о стандарте, кроме этого саркастического предупреждения с -pedantic

g.cpp:8: error: ISO C++ forbids taking address of function '::main'

Ответ 3

Если конкретная реализация позволяет это, она не ведет себя правильно (а). Стандартное состояние довольно явно в C++14, 3.6.1 Main function/3:

Функция main не должна использоваться внутри программы.


(a) Имейте в виду, что многие реализации слабо следуют некоторым частям стандарта, предпочитая силу строгости. Это может иметь неблагоприятный побочный эффект, так как ваш код не может быть переносим на другие компиляторы или даже на другие версии того же компилятора.

Многие реализации также позволят вам принять более строгий режим, например, использовать g++ -std=c++11 -Werror=pedantic который улавливает конкретную проблему, купленную в этом вопросе, а также довольно много других. Именно этот "режим" перевода позволяет реализациям претендовать на соответствие стандарту согласно 1.4 Implementation compliance:

Если программа содержит нарушение какого-либо диагностируемого правила..., соответствующая реализация должна выдать хотя бы одно диагностическое сообщение.

Вы увидите, что в этом случае все еще возможно разрешить компиляцию и запуск кода, поскольку "диагностическое сообщение" может означать скорее предупреждение, чем ошибку.

Ответ 4

Как правило, нет. Пока вам будет достаточно знать, что компилятор должен знать точную функцию, которую вы вызываете во время компиляции. Вы не можете делать магию, скажем,

func = "my_function"; 
func(); 

если имя вызываемой функции изменится во время выполнения. (Есть исключения и пути вокруг этого, но вам это не нужно).

Не думайте об этом как о жестком кодировании: это не так. Если вам нужно вызвать функцию, вы просто напишите ее имя и не пытайтесь ее абстрагировать или что-то в этом роде.

Кроме того, теперь будет хороший способ узнать о цикле while, бесконечных циклах и писать без вызовов функций вообще, например

int main()
{
    while (1) {
        cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
        system("pause");
    }
}

Ответ 5

функция не может вызывать себя, но мы можем сделать трюк

#include<iostream>
int main()
{
int r=6;
//we here can make a loop for the program to repeat itself with do{}while(r=6).
do{
int a;
cin>>a;
if(a>5)
cout<<"hi i repeat myself";
}while(r==6);
return 0;
}