用c ++调用main()本身?

时间:2010-03-28 12:44:29

标签: c++

#include <iostream>
#include <cstdlib>

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

上述工作,但它硬编码main()功能。是否有神奇的变量或宏来获取当前的运行函数?

4 个答案:

答案 0 :(得分:12)

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

#include <iostream>
using namespace std;

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

int main() {
   foo();
}
如果支持__FUNCTION__

应打印“foo”或类似内容。

答案 1 :(得分:12)

“C ++”允许吗?否。

在实践中,你能打电话给main()吗?是。

无论C ++标准如何说,这并不能阻止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'

答案 2 :(得分:4)

如果特定的实现允许这样做,则表明其行为不正确(a)C++14, 3.6.1 Main function /3中的标准状态非常明确:

  

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

(a)请记住,许多实现都是松散地遵循标准的某些部分,而不是严格要求权力。这可能会产生令人遗憾的副作用,即您的代码可能无法移植到其他编译器甚至其他版本的相同编译器。

许多实现还允许您采用更严格的视图,例如使用g++ -std=c++11 -Werror=pedantic来捕获在此问题中购买的特定问题,以及其他一些问题。就是&#34;模式&#34;允许实现声称符合标准的翻译,根据1.4 Implementation compliance

  

如果程序包含违反任何可诊断规则的行为......,符合要求的实施应至少发出一条诊断消息。

您会发现在这种情况下仍然可以允许代码编译和运行,因为&#34;诊断消息&#34;可能意味着警告而不是错误。

答案 3 :(得分:0)

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

func = "my_function"; 
func(); 

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

不要将其视为硬编码的情况:事实并非如此。如果你需要调用该函数,那么你只需要写出它的名字,不要试图抽象它,或者其他东西。

此外,现在将是了解while循环,无限循环以及完全没有函数调用的简单方法,例如

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