【问题标题】:C/C++ - how is (void) used not as a parameter? [duplicate]C/C++ - (void) 如何不用作参数? [复制]
【发布时间】:2013-11-29 17:36:09
【问题描述】:

我在 C/C++ 中看到了一些类似这样的代码:

void Main(void)

int Main(void)

这是什么原因:为什么它不是参数而是在void/int e.t.c名称后面的括号中使用?

【问题讨论】:

  • 又回到了C,这个问题重复了stackoverflow.com/questions/9545208/…
  • 这是其中一个问题的答案取决于您是指 C 还是 C++。没有 C/C++ 语言这种东西。
  • 我已经回滚以保持名称大写 Main 因为它 void main(void) 是一个错误。

标签: c++ c void


【解决方案1】:

在 c++ 中,如果参数“名称”不是从函数内调用的,有时可能会被排除在外。如果你知道你会使用它,你可以自己添加参数名称。不过,main 的 void 参数几乎没有意义。

【讨论】:

    【解决方案2】:

    在旧的编译器中,必须在括号中指定 void,以防 main 不接受任何参数。但这些天你可能只需要使用like:

    void main() 
    

    【讨论】:

    • -1,C 和 C++ 都没有改变其各自 () 的含义,并且两种语言都不允许 main 返回 void
    【解决方案3】:

    在 C 中,(void) 表示函数调用中不需要参数,而 () 表示未指定数量的参数。在 C++ 中。 () 与 (void) 含义相同

    这是 C 标准所说的

    5.1.2.1 独立环境

    在独立的环境中(C 程序的执行可能需要 没有任何操作系统好处的地方),名称和类型 程序启动时调用的函数是实现定义的。 / .. / 程序终止在独立环境中的影响 是实现定义的。

    5.1.2.2 托管环境

    无需提供托管环境,但应符合 以下规格(如果有)。

    5.1.2.2.1 程序启动

    程序启动时调用的函数名为main。这 实现没有声明这个函数的原型。应该是 返回类型为 int 且不带参数定义:

    int main(void) { /* ... */ }
    

    或带有两个参数(此处称为 argc 和 argv,尽管任何 可以使用名称,因为它们对于它们所在的函数是本地的 声明):

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

    【讨论】:

    • -1:给定的引用不支持前面的答案,或者似乎与问题有关。
    • @Potatoswatter 你是对的,但实际上它令人困惑,因为 OP 使用了函数名Main
    • @GrijeshChauhan 由于各种原因,我现在有点头晕,我第一次读到这个问题时看起来很清楚,但现在看来措辞很糟糕。无论如何,他似乎在询问void 部分而不是main 部分。
    • @GrijeshChauhan 很奇怪,从问题 cmets 链接的另一个答案声称语法是“宿醉”。去图吧。
    【解决方案4】:

    在 C 中

    void func() {
    }
    

    表示一个接受 indeterminate 个参数的函数。如果你想编写一个接受零参数的函数,你可以这样做

    void func(void) {
    }
    

    原因在于 C 语言的历史,否则它们没有多大意义。出于这个原因,C++ 改变了规则。在 C++ 中,上面的第一个示例表示一个接受零参数的函数,而 this

    void func(int x, ...) {
    }
    

    表示一个函数,它接受可变数量的参数(在这种情况下为一个或多个)。 C 也会接受这个。

    所以在 C 和 C++ 中,示例 2 表示零参数,示例 3 表示可变数量的参数,但 C 和 C++ 对示例 1 的含义存在分歧,对于 C 来说,它是不确定数量的参数,对于 C++ 来说,它是零参数。

    如果您在 C++ 程序中看到 (void),它要么是从 C 移植的代码并且没有人愿意更改它,要么是预计将被编译为 C 和 C++ 的代码(在标题中例如文件)。

    【讨论】:

    • @Potatoswatter,我就是这么说的。
    • @Potatoswatter 好的,我会更新我的答案,但我认为不确定和可变之间的区别几乎不值得。
    • OK 改变了,不完全确定你做了什么区分,但我想你是对的。
    • 您的回答部分错误。 Yoru 第一个例子,因为它是一个函数 definition 仍然声明一个不接收参数的函数。只有在纯声明(无定义)中,有无原型的声明的区别才会产生真正的区别。
    【解决方案5】:

    void 在参数列表中实际上是一个关键字,而不是指定任何内容的类型。它存在的原因纯粹是历史原因。

    早期的 C 没有函数原型或参数列表的任何语法。函数定义如下所示:

    foo()
    int x; // These are the parameters.
    float y;
    {
        return x + (int) y;
    }
    

    “不需要”原型,因为编译器会假定每个调用都准确地传递了正确的类型和数量的参数。这很容易出错。此外,返回类型被假定为int,这是一个更加脆弱的假设。第一个原型只指定了返回类型。

    float foo(); // Still no parameters.
    

    当引入熟悉的float foo( int x, float y ) 语法时,保留了与前面样式的向后兼容性。 void 关键字用于区分不确定(缺失)参数列表和空参数列表。

    在 C 语言中,float foo()float foo( void ) 至今仍有不同的含义。

    在 C++ 中,不支持不确定的参数列表,float foo( void )float foo() 的同义词,但不提倡使用。

    此外,C++ 允许模板确定参数的类型,但通过模板生成(void) 参数列表是错误的。

    【讨论】:

    • 至少有人提到了用于声明函数参数的 pre-ANSI 语法!
    【解决方案6】:

    草案 n1570;

    5.1.2.2.1 程序启动:

    程序启动时调用的函数名为main。实现声明没有 这个函数的原型。它应定义为返回类型int 没有 参数

    int main(void) { /* ... */ }
    

    或者带两个参数(这里指argcargv.....)

    从 C 标准中可以清楚地看出,void 用于没有参数的函数。

    【讨论】:

    • 但他问为什么不是参数?
    • @Potatoswatter;因为标准说它用于无参数。无需拉扯羊毛。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 2012-11-08
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 2011-07-20
    相关资源
    最近更新 更多