#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"或类似的东西.
如果特定的实现允许这样做,则它的行为不正确(a)。标准状态非常明确地显示在C++14, 3.6.1 Main function /3
:
该功能
main
不得在程序内使用。
(a)请记住,许多实现宽松地遵循了标准的某些部分,而不是严格性强于权力。不幸的是,您的代码可能无法移植到其他编译器甚至同一编译器的其他版本中,这可能会带来不幸的副作用。
许多实现也将使您采取更严格的观点,例如使用g++ -std=c++11 -Werror=pedantic
来捕获在该问题中购买的特定问题,以及许多其他问题。正是这种“翻译模式”允许实现声称符合该标准,具体如下1.4 Implementation compliance
:
如果程序包含违反任何可诊断规则的行为,则合格的实施应至少发出一条诊断消息。
您将看到在这种情况下仍然有可能允许代码编译和运行,因为“诊断消息”可能意味着警告而不是错误。