gpt4 book ai didi

c - c编译器如何解释在同一语句中声明函数和变量?

转载 作者:太空宇宙 更新时间:2023-11-04 01:47:02 25 4
gpt4 key购买 nike

我遇到了 K&R 中的一个声明,其中函数和变量在“指针”一章中一起声明:

double atof(), *dp;

C 编译器如何处理上述声明?

最佳答案

声明的语法 (C17 6.7) 是:

declaration:
declaration-specifiers init-declarator-list(opt) ;

声明说明符的一种情况是类型说明符,在本例中为double

进一步深入 init-declarator-list 得到 init-declarator,可选的几个用逗号分隔:

init-declarator-list:
init-declarator
init-declarator-list , init-declarator

init_declarator 依次给出 declarator,其语法为 (C17 6.7.6):

declarator:
pointer(opt) direct-declarator

在示例中,atof()dpdirect-declarator,其中dp 有可选的指针语法。

这意味着 atof() 结束一个函数返回 double*dp 一个指向 double 的指针.

(如果你想像上面一样深入了解原始语法,标准的附件 A 会很有帮助。没有一个理智的人会在不查找的情况下记住这样的事情。)


但是真的没有理由去思考像这样写得糟糕的代码。以下是公认的不良做法:

  • 在文件范围内将函数声明写在其他任何地方,但作为其自己的一行。
  • 编写没有原型(prototype)格式的函数声明。标准 C 7.22.1.1 中 atof 的正确原型(prototype)是 double atof(const char *nptr);。而 double atof() 表示采用任何参数的函数。根据 C17 6.11.6,这是过时的样式。
  • 在一行中写多个声明。不要写double d, *dp;之类的东西,写double d;双 * dp;。众所周知,前者会因为不小心声明了错误的类型而导致错误。作为奖励,如果您总是拆分声明,则不必考虑编写 double* dp 样式还是 double *dp 样式更正确。

总结:不要阅读 1970 年代过时的编程书籍。尝试对 C90 进行 K&R 更新是草率的,并且该书的许多第 2 版都没有跟上 1989 年的变化。例如,过时的样式已经存在于 C90 6.9.4 中。所以这本书包含的实践在 1989 年已经被 C 标准标记为过时了!简直太可怕了。

关于c - c编译器如何解释在同一语句中声明函数和变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51852988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com