'使用函数'是什么意思

时间:2010-08-26 04:03:31

标签: c++ function

$ 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 
}
  1. 足够公平,显示的代码用gcc / VS 2010编译。

  2. 我对Comeau的错误感到惊讶。

  3. Comeau online在声明'p'时出错(即在接收'main'的地址时),但在声明'main'为朋友的时候却没有。

    关于C ++ 03的谁/什么是正确的?

4 个答案:

答案 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兼容性说:

3.6

的变化

更改:不能递归调用Main,也不能取其地址 理由:主要功能可能需要特殊操作 对原始功能的影响:删除语义定义明确的功能
难以转换:琐碎:创建一个中间函数,例如mymain(argc,argv。
广泛使用:很少

答案 2 :(得分:0)

按照确切的措辞(“不得使用 ”),我认为第一个例子被认为是合法的,因为它不使用无论如何。它在某处添加了某种引用,并允许该函数访问私有数据。它不使用main(),它提供了更多访问权限。

第二个例子(取地址)实际上使用main()作为符号,取其地址并将其放入指向函数的指针中。这不仅可以让你轻松打破不在程序中调用main的规则,它还必须与它进行交互(至少是告诉main在哪里的信息)。

答案 3 :(得分:0)

我认为在第一种情况下,朋友功能只是指“一些叫做main的功能”,而在第二种情况下它的相当“哦,你的意思是一个主要的?我不能允许”。