代码之家  ›  专栏  ›  技术社区  ›  fredoverflow

什么是主声明?

  •  139
  • fredoverflow  · 技术社区  · 14 年前

    正确的签名是什么 main C++中的函数?正确的返回类型是什么,从中返回值意味着什么 主要的 ?允许的参数类型是什么?它们的含义是什么?

    这个系统是特定的吗?这些规则随时间变化了吗?如果我违反了它们会发生什么?

    5 回复  |  直到 14 年前
        1
  •  180
  •   James McNellis    8 年前

    这个 main 函数必须声明为全局命名空间中的非成员函数。这意味着它不能是类的静态或非静态成员函数,也不能放在命名空间(甚至是未命名的命名空间)中。

    名字 主要的 除了在全局命名空间中的函数之外,在C++中不保留。您可以自由声明其他名为 主要的 包括不在全局命名空间中的类、变量、枚举、成员函数和非成员函数。

    可以声明一个名为 主要的 作为成员函数或在命名空间中,但这样的函数不会是 主要的 指定程序启动位置的函数。

    这个 主要的 函数不能声明为 static inline . 它也不能重载;只能有一个名为 主要的 在全局命名空间中。

    这个 主要的 函数不能在程序中使用:不允许调用 主要的 函数在代码中的任何位置,也不允许获取其地址。

    返回类型 主要的 必须是 int . 不允许使用其他返回类型(此规则为粗体,因为通常会看到声明 主要的 返回类型为 void ;这可能是关于 主要的 函数)。

    有两种声明 主要的 必须允许:

    int main()               // (1)
    int main(int, char*[])   // (2)
    

    (1) ,没有参数。

    (2) ,有两个参数,它们按惯例命名。 argc argv ,分别。 阿尔加夫 指向表示程序参数的C字符串数组的指针。 氩弧焊 是中的参数数目 阿尔加夫 数组。

    通常, argv[0] 包含程序名,但情况并非总是如此。 argv[argc] 保证为空指针。

    注意,由于数组类型参数(如 char*[] )实际上只是一个伪装的指针类型参数,下面两个都是有效的写入方法 (2) 它们的含义完全相同:

    int main(int argc, char* argv[])
    int main(int argc, char** argv)
    

    有些实现可能允许其他类型和数量的参数;您必须检查实现的文档以了解它支持什么。

    main() 预期返回零表示成功,非零表示失败。您不需要显式地编写 return 语句在 主体() 如果你让 主体() 不带显式返回 返回 声明,就像你写的一样 return 0; . 以下两个 主体() 函数具有相同的行为:

    int main() { }
    int main() { return 0; }
    

    有两个宏, EXIT_SUCCESS EXIT_FAILURE ,定义在 <cstdlib> 也可以从 主体() 分别表示成功和失败。

    返回的值 主体() 传递给 exit() 函数,它终止程序。

    请注意,所有这些仅在为托管环境编译时适用(非正式地说,这是一个拥有完整标准库且有运行程序的操作系统的环境)。编译独立程序环境(例如,某些类型的嵌入式系统)的C++程序也是可能的,在这种情况下,启动和终止是完全实现的定义和A。 主体() 甚至可能不需要函数。如果你正在为现代桌面操作系统编写C++,那么你正在编译一个托管环境。

        2
  •  15
  •   liaK    14 年前

    来自标准文件, 3.6.1.2主要功能 ,

    它应该有回报 类型为int,但其类型是实现定义的。 所有实施应允许以下两种情况: 主要定义:

    int main() { / ... / } int main(int argc, char* argv[]) { / ... / }

    后一种形式 argc 应该是 传递给程序的参数数 从环境中 程序正在运行。如果argc非零 这些参数应以argv[0]到argv[argc-1]的形式提供,作为指向 以空结尾的多字节字符串的初始字符

    希望有帮助……

        3
  •  4
  •   M.M    8 年前

    最新公布的标准(C++ 14)的确切措辞是:

    实施应允许

    • 函数 () 返回 int

    • 函数 (int ,指向指针的指针 char) 返回 int

    作为类型 main .

    这就清楚地表明,只要 主要的 是类型 int() int(int, char**) . 因此,还允许以下内容:

    • int main(void)
    • auto main() -> int
    • int main ( )
    • signed int main()
    • typedef char **a; typedef int b, e; e main(b d, a c)
        4
  •  3
  •   Yousha Aleayoub Albert    7 年前

    两个有效电源是 int main() int main(int, char*[]) . 任何其他东西都可以编译,也可以不编译。如果 main 不显式返回值, 是隐式返回的。

        5
  •  2
  •   Ben Voigt    13 年前

    返回值及其含义的详细信息

    3.3.1 [basic.start.main] ):

    返回语句 main 具有离开 主要的 函数(销毁具有自动存储时间的任何对象)并调用 std::exit 以返回值为参数。如果控制达到 主要的 没有遇到 return 语句,效果是执行

    return 0;
    

    行为 STD::退出 详见第18.5节。( [support.start.term] )并描述状态代码:

    最后,控制权返回到主机环境。如果状态为零或 EXIT_SUCCESS ,将返回状态成功终止的实现定义形式。如果状态是 EXIT_FAILURE ,将返回状态“未成功终止”的实现定义形式。否则返回的状态是实现定义的。