在C ++中调用main()本身?

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

上面的工作,但它硬编码的main() ,是否有一个神奇的variables,以获得当前的运行function?

C ++标准说,你不能从你自己的代码中调用main()。 至于获取当前函数的名称,可以使用__FUNCTION__macros,但是这又不是标准的:

 #include <iostream> using namespace std; void foo() { cout << __FUNCTION__ << endl; } int main() { foo(); } 

应该打印“foo”或类似的东西,如果__FUNCTION__支持。

它允许在“C ++”吗? 没有。

在实践中,你可以调用main()吗? 是。

不pipeC ++标准如何,这并不能阻止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 ++似乎并不关心这个标准,除了这个讥讽的警告

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

如果一个具体的实现允许这样做,它是不正确的行为(一) )。 C++14, 3.6.1 Main function /3的标准状态C++14, 3.6.1 Main function /3

函数main不能在程序中使用。


(a)请记住,许多实现松散地遵循标准的某些部分,宁愿超越严格的权力。 这可能会有不幸的副作用,您的代码可能无法移植到其他编译器,甚至是同一编译器的其他版本。

许多实现也将允许你采取更严格的观点,比如使用g++ -std=c++11 -Werror=pedantic来捕捉在这个问题中购买的特定问题,以及其他一些问题。 翻译的“模式”允许实现声明符合标准, 1.4 Implementation compliance

如果一个程序包含违反任何可诊断的规则…,那么符合的实现将至less发出一条诊断消息。

您将会看到在这种情况下仍然可以允许代码编译和运行,因为“诊断消息”可能意味着警告而不是错误。

一般来说,不。 现在,只要知道编译器需要知道在编译时调用的确切函数就足够了。 比方说,你不能做魔术

 func = "my_function"; func(); 

如果被调用的函数名称在运行时会改变。 (有例外和方法,但你不需要)。

不要认为这是一个硬编码的情况:事实并非如此。 如果你需要调用这个函数,那么你只需要写下它的名字,而不要把它抽象出来。

此外,现在将是一个很好的方式来了解while循环,无限循环和写入没有函数调用,例如

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

一个函数不能调用自己,但我们可以制造一个诡计

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