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

Mas*_*ask 12 c++

#include <iostream>
#include <cstdlib>

int main() {
    cout << "!!!Hello World!!!" << endl;
    system("pause");
    return main();
}
Run Code Online (Sandbox Code Playgroud)

上面的工作,但它硬编码main(),是否有一个神奇的变量来获得当前的运行功能?

Car*_*lsh 13

是否允许"C++"?没有.

在练习中,你可以打电话main()吗?是.

无论C++标准如何说,这都不能阻止Linux g ++编译器使用main()in 编译代码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();
}
Run Code Online (Sandbox Code Playgroud)

这让我们做:

 > g++ g.cpp; ./a.out
 y = 3
 y = 6
 y = 7
Run Code Online (Sandbox Code Playgroud)

查看程序集,我们看到main就像任何其他函数一样被调用:

main:
        ...
        cmpl    $7, -12(%rbp)
        je      .L7
        call    main
        ...
.L7:
        ...
        leave
        ret
Run Code Online (Sandbox Code Playgroud)

并不是说这种行为是有保证的,但看起来g ++似乎并不真正关心标准,除了这个讽刺警告 -pedantic

g.cpp:8: error: ISO C++ forbids taking address of function '::main'
Run Code Online (Sandbox Code Playgroud)


小智 12

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

#include <iostream>
using namespace std;

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

int main() {
   foo();
}
Run Code Online (Sandbox Code Playgroud)

如果__FUNCTION__支持,应该打印"foo"或类似的东西.

  • 在元数据方面,\ _ _ _ func\_\_将很快成为标准. (4认同)
  • 好吧,如果你要假设非标准的`__FUNCTION__`,那么你也可以假设非标准的`dlopen`和`dlsym`(或等价的),并获得一个函数指针...... (2认同)

pax*_*blo 5

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

该功能main不得在程序内使用。


(a)请记住,许多实现宽松地遵循了标准的某些部分,而不是严格性强于权力。不幸的是,您的代码可能无法移植到其他编译器甚至同一编译器的其他版本中,这可能会带来不幸的副作用。

许多实现也将使您采取更严格的观点,例如使用g++ -std=c++11 -Werror=pedantic来捕获在该问题中购买的特定问题,以及许多其他问题。正是这种“翻译模式”允许实现声称符合该标准,具体如下1.4 Implementation compliance

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

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