$ 3.6.1 / 3州 -
“函数main不能使用 (3.2)在一个程序中。“。
下面的示例学术动机程序使用了我认为合法的几种名称“main”。这是基于“函数的使用”与调用函数(直接/间接)相关的假设。
struct MyClass{
private:
MyClass(){}
friend int main();
};
int main(){
MyClass m;
int (*p)() = main; // but don't do anything
}
足够公平,显示的代码用gcc / VS 2010编译。
我对Comeau的错误感到惊讶。
Comeau online在声明'p'时出错(即在接收'main'的地址时),但在声明'main'为朋友的时候却没有。
关于C ++ 03的谁/什么是正确的?
答案 0 :(得分:6)
C ++03§3.2/ 2说:
如果对象或非重载函数的名称出现在可能已评估的表达式中,则使用该函数。
继续列出其他各类实体的使用的构成;这是重要的一个。
朋友声明不是表达。
当函数main()
转换为指针并且指针被分配给p
时,这是一个表达式并且可能被评估(C ++03§3.2/ 2):
表达式可能被评估,除非它出现在需要整数常量表达式的地方(见5.19),是
sizeof
运算符(5.3.3)的操作数,或者是typeid
运算符的操作数和表达式未指定多态类类型的左值(5.2.8)。
答案 1 :(得分:1)
C ++ 03附录C.1关于C ++和ISO C兼容性说:
更改:不能递归调用Main,也不能取其地址
理由:主要功能可能需要特殊操作
对原始功能的影响:删除语义定义明确的功能
难以转换:琐碎:创建一个中间函数,例如mymain(argc,argv。
广泛使用:很少
答案 2 :(得分:0)
按照确切的措辞(“不得使用 ”),我认为第一个例子被认为是合法的,因为它不使用无论如何。它在某处添加了某种引用,并允许该函数访问私有数据。它不使用main()
,它提供了更多访问权限。
第二个例子(取地址)实际上使用main()
作为符号,取其地址并将其放入指向函数的指针中。这不仅可以让你轻松打破不在程序中调用main的规则,它还必须与它进行交互(至少是告诉main在哪里的信息)。
答案 3 :(得分:0)
我认为在第一种情况下,朋友功能只是指“一些叫做main的功能”,而在第二种情况下它的相当“哦,你的意思是一个主要的?我不能允许”。