#include <iostream>
#include <cstdlib>
int main() {
cout << "!!!Hello World!!!" << endl;
system("pause");
return main();
}
上述工作,但它硬编码main()
功能。是否有神奇的变量或宏来获取当前的运行函数?
答案 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");
}
}