#include <iostream>
#include <cstdlib>
int main() {
cout << "!!!Hello World!!!" << endl;
system("pause");
return main();
}
上面的工作,但它硬编码main()
功能。是否有魔术变量或宏来获取当前的运行功能?
C ++标准说你不能从你自己的代码中调用main()。至于获取当前函数的名称,可以使用__FUNCTION__
宏,但这又不是标准的:
#include <iostream>
using namespace std;
void foo() {
cout << __FUNCTION__ << endl;
}
int main() {
foo();
}
如果支持__FUNCTION__
,应该打印“foo”或类似的东西。
是否允许“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'
如果特定实现允许这样做,则它的行为不正确(a)。标准状态在C++14, 3.6.1 Main function /3
中非常明确:
函数
main
不得在程序中使用。
(a)请记住,许多实现都是松散地遵循标准的某些部分,而不是严格要求权力。这可能会产生令人遗憾的副作用,即您的代码可能无法移植到其他编译器或同一编译器的其他版本。
许多实现还允许您采取更严格的观点,例如使用g++ -std=c++11 -Werror=pedantic
捕获在此问题中购买的特定问题,以及其他一些。根据1.4 Implementation compliance
,正是翻译的“模式”允许实现声称符合标准:
如果程序包含违反任何可诊断规则的情况......,符合要求的实现应至少发出一条诊断消息。
您将看到在这种情况下仍然可以允许代码编译和运行,因为“诊断消息”可能意味着警告而不是错误。
一般来说,没有。现在,只要知道编译器需要知道您在编译时调用的确切函数就足够了。让我们说,你不能做魔术
func = "my_function";
func();
如果被调用的函数名称将在运行时更改。 (有例外和方法,但你不需要)。
不要将其视为硬编码的情况:事实并非如此。如果你需要调用该函数,那么你只需要写出它的名字,不要试图抽象它,或者其他东西。
此外,现在将是学习while循环,无限循环以及在没有函数调用的情况下进行写入的好方法,例如
int main()
{
while (1) {
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
system("pause");
}
}