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

问题描述 投票:12回答:4
#include <iostream>
#include <cstdlib>

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

上面的工作,但它硬编码main()功能。是否有魔术变量或宏来获取当前的运行功能?

c++
4个回答
12
投票

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

#include <iostream>
using namespace std;

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

int main() {
   foo();
}

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


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'

4
投票

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

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


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

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

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

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


0
投票

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

func = "my_function"; 
func(); 

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

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

此外,现在将是学习while循环,无限循环以及在没有函数调用的情况下进行写入的好方法,例如

int main()
{
    while (1) {
        cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
        system("pause");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.