【问题标题】:Why do we have different versions of main functions in c++? [duplicate]为什么我们在 c++ 中有不同版本的 main 函数? [复制]
【发布时间】:2012-10-05 05:51:36
【问题描述】:

可能重复:
What is the difference between _tmain() and main() in C++?

void main(...)、int main(..) 和 int _tmain() 有何不同。它们都是单进单出系统。但是我们在什么情况下使用这些启动功能呢?

【问题讨论】:

  • AFAIK _tmain 是 Microsoft 特定的...
  • void main() 是非常古老的 C++。
  • void main()从不有效的 C++。
  • void main() 也从来不是有效的 C(除了实现可能支持它作为扩展)。引入 void 关键字的同一标准(1989 年 ANSI C 标准)定义了两种有效形式:int main(void)int main(int argc, char *argv[]) 或等效形式。某些书籍作者发明了void main() 有效的错误观念;我想知道为什么。

标签: c++


【解决方案1】:

void main() 无效; C++ 标准要求main 返回int。一些编译器可以让你摆脱它。

int main() 是两种标准形式之一。另一个是int main(int argc, char *argv[]),可以用来接收命令行参数。实现可能允许其他形式,但不是必须的——但所有这些形式必须返回int

int _tmain() 专用于 Microsoft。

【讨论】:

  • 纳米。你完全正确。 3.6.1 p2
  • N3337 第 3.6.1 节 [basic.start.main]; int main(int argc) 不是必需的表单之一。
【解决方案2】:

不同的实现支持不同的入口点(或入口点的选择)的原因是不同的操作系统或环境有不同的运行程序的方式,或者将参数信息传递给程序的不同方式。

C++ 实现有两种:

“托管”实现假定存在某种操作系统。在托管实现中,符合程序要求main,并且必须返回int

“独立”实现不假定存在操作系统。在独立实现上,是否需要 main 取决于实现,但标准仍然规定,如果需要 main,则必须返回 int

实现的常见做法是提供托管实现的功能,但允许main 以外的入口点。这符合托管实现的标准,前提是接受确实定义main 的符合程序。实际上,实现允许(作为扩展)某些没有main 函数的不合格程序,只要它们包含实现定义的替代方案。从技术上讲,我认为它必须诊断“错误”,但实际上没有人会意外使用这样的扩展,所以他们可能不想看到诊断。

同样,符合要求的实现可以接受包含void main 的程序。同样,为了使实现符合要求,它必须诊断出程序不符合要求。

实现无论如何都接受的不合格程序的含义取决于实现。

_tmain 是 MS 扩展。它是窄字符版本中main 和宽字符版本中wmain 的别名。 wmain 也是一个 MS 扩展,它类似于 main,只是 argv 提供为宽字符串而不是窄字符串。因此,这是一个环境示例,其中有两种不同的方式为程序提供参数,具体取决于程序是否处理窄字符范围之外的字符(即 8 位代码页之外)。

【讨论】:

  • +1 获取一些正确信息
猜你喜欢
  • 2010-10-01
  • 2019-02-06
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
相关资源
最近更新 更多