RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 859679
Accepted
Александр
Александр
Asked:2020-07-24 21:17:16 +0000 UTC2020-07-24 21:17:16 +0000 UTC 2020-07-24 21:17:16 +0000 UTC

void 作为参数

  • 772

函数声明有何不同?

int main(){}

从

int main(void){}

?

一切似乎都一样,但后者经常出现在源代码中。如果没有区别,为什么要写太多?

c++
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    user218976
    2020-07-24T21:23:48Z2020-07-24T21:23:48Z
    void foo(void);
    

    这是在 C、C++ 中声明不带参数的函数的正确方法。

    另一方面:

    void foo();
    

    在 C 和 C++ 中有不同的含义!在 C 中,它的意思是“可以接受任意数量的未知类型的参数”,在 C++ 中,它的含义与foo(void).

    可变参数函数本质上是不安全的,应尽可能避免使用。

    资源

    • 11
  2. Croessmah stands with Russia
    2020-07-25T05:04:08Z2020-07-25T05:04:08Z

    我建议处理类似的语法。

    在 C 语言中,函数可以声明为

    6.7.6.3 函数声明器(包括原型

    1. 如果,在声明“T D1”中,D1 的形式为
      D(parameter-type-list)
      或
      D(identifier-list_opt)

    如您所见,我们有两种声明方式:

    1. 括号内的parameter-type-list
    2. 括号内的identifier-list

    在这种情况下,它parameter-type-list是强制性的,但它identifier-list是可选的 ( _opt)。

    现在让我们看看它是什么identifier-list:

    1. 标识符列表仅声明函数参数的标识符。作为该函数定义的一部分的函数声明器中的空列表指定该函数没有参数。不属于该函数定义的函数声明器中的空列表指定不提供有关参数数量或类型的信息。

    也就是说,具有identifier-list此声明的函数:

    void foo(a, b, c) int a, b, c;//Функция объявлена с identifier-list
    

    同时,这样的声明在调用时不会对参数的类型和数量施加限制。此外,这样的列表是可选的,即 可能会丢失。

    void foo();//Функция с пустым identifier-list
    

    这意味着在调用这样的函数时,您可以传递不同数量的不同类型的参数,即 打电话foo()或foo(1, 2)合法。

    让我们去parameter-type-list:

    1. 参数类型列表指定函数参数的类型,并且可以声明函数参数的标识符。

    这是参数类型的列表,可能还有标识符:

    void foo(char, int, float x);//Функция объявлена с parameter-type-list
    

    请参阅以下标准:

    1. void 类型的未命名参数作为列表中的唯一项的特殊情况指定该函数没有参数。

    也就是说,声明一个不带参数的函数有一种特殊情况——一个void没有名称的类型参数:

    void foo(void);//Функция без параметров
    

    对于这样的函数,调用foo(1, 2)不再正确,与identifier-list.

    现在,关于 C++。C++ 有一种声明函数的方法:

    1. 在有表格的声明T D中D
      D1 ( parameter-declaration-clause ) cv-qualifier-seq_opt ref-qualifier_opt noexcept-specifier_opt attribute-specifier-seq_opt trailing-return-type

    有一个规则:

    1. ...如果参数声明子句为空,则该函数不接受任何参数。由非依赖类型 void 的单个未命名参数组成的参数列表等效于空参数列表。

    也就是说,对于 C++ 声明

    void foo();
    void foo(void);
    

    是完全等价的。

    还有一点历史。Bjorn Stroustrup 的书“C++ 的设计和演变”的节选:

    为不带参数的函数C with Classes引入了符号,而不是用于表示具有任意数量的参数而不进行类型检查的函数的符号。然而,用户很快就让我相信这种表示法并不优雅,并且使用可以接受参数的函数进行声明远非直观。因此,经过一些实验,决定为不带任何参数的函数保留符号,因为这是没有经验的用户所期望的。为了敢于打破传统,我需要道格·麦克罗伊和丹尼斯·里奇的支持。只有在他们用“恶心”这个词来描述这个符号之后,我才决定给f(void)f()f()Cf(void)f()f()Cf(void)f()明显的语义。然而时至今日,in的型控规则C比in弱得多C++,标准委员会批准了最先出现ANSI C的“恶心” 。f(void)C with Classes

    • 3
  3. NewView
    2020-07-24T21:21:57Z2020-07-24T21:21:57Z

    这样编译器就不骂了,按照标准,函数接受的参数必须要描述,如果不存在,void则为空/无参数。

    尝试在不void使用 keys的情况下构建代码,密钥(gcc 或 clang)-Wall -Wextra -pedantic对语言C很有用,您将看到编译器的反应。-Wstrict-prototypes

    查看编译器开关以获取有关您自己的代码的更多信息可能会很有用。

    例如,分析您自己的代码的重要键:

    -墙

    包括关于一些用户认为有问题且易于避免(或更改以防止警告)的结构的所有警告,即使与宏结合使用,换句话说,一些警告。

    -Wpedantic

    发出严格的 ISO C 和 ISO C++ 要求的所有警告;拒绝所有使用禁止扩展的程序和一些其他不符合 ISO C 和 ISO C++ 的程序。

    -Wextra

    对正在构建的代码进行更完整的测试,包括最大可能的警告,但某些警告仅单独设置。

    -一切

    一个特定的编译器标志clang,打开它后,有时希望删除所写的内容:)

    -Werror -pedantic-errors

    -Werror检测到警告时抛出错误, 分别转移warnings到,执行相同操作,仅适用于mode 中可用的警告。errors-pedantic-errors-pedantic

    历史参考:

    最初,C 函数没有原型,因为它们是从一种无偏见的语言C 演变而来B的 :)。
    添加原型时,为了向后兼容,原始的无文本声明保留在语言中。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5