【问题标题】:Declaring a function prototype in a brace在大括号中声明函数原型
【发布时间】:2020-11-16 10:03:50
【问题描述】:

在“C 编程语言(第 2 期)”71~72p,

其次,同样重要的是,调用例程必须知道 atof 返回一个非整数值。确保这一点的一种方法是在调用例程中显式声明 atof

以及包含上述部分的段落下方的代码。

#include <stdio.h>

#define MAXLINE 100

/* rudimentary calculator */
main()
{
    double sum, atof(char []);
    char line[MAXLINE];
    int getline(char line[], int max);

    sum = 0;
    while (getline(line, MAXLINE) > 0)
        printf("\t%g\n", sum += atof(line));
    return 0;
}

函数原型通常在顶部声明。但是为什么函数原型double atof(char[])会在main()中声明呢?虽然我是新手,但从没见过这样的。

【问题讨论】:

  • 在哪里声明它并不重要。只需要在使用前声明即可。
  • 因为这是 “一种确保 [调用例程知道 atof 返回非整数值]”的方法。,根据引用。
  • 又名“(如何滥用)C 编程语言”。您可能想阅读另一本不太关注如何不编写代码的书。因为这段代码是 100% 可怕的。 atof 不应该首先使用,因为它的错误处理,总是使用 strtof
  • @Lundin 我想你的意思是strtod 在这种情况下。
  • @opol 我刚刚编的,但是这本书已经过时了,而且使用的编码风格有害且难以遵循。并且它教会你依赖于不明确的行为,因为它是在任何标准化之前编写的,并且在第二版中转换为 C90 是草率的。任何在一本旨在教授 C 的书中写诸如 double sum, atof(char []); 之类的东西的人都不应该教 C,时期。任何在生产代码中编写类似内容的人都会被解雇。

标签: c scope function-call function-declaration function-prototypes


【解决方案1】:

对于 C 早期版本的初学者,您可以调用函数而不在函数调用之前声明它。在这种情况下,默认情况下,函数的返回类型是 int。

注意,一般来说函数声明不一定要提供函数原型。

比较这两个函数声明

int f();

int f( void );

第一个函数声明意味着你可以不说函数参数的数量和类型。

第二个声明确实是函数原型,表示该函数没有参数。

因此,如果程序中有函数调用并且您使用的是旧编译器,则假定该函数具有返回类型 int

要告诉编译器函数有不同的返回类型,你需要在函数调用之前声明函数。

您可以在文件范围或调用该函数的块范围内声明一个函数。

这个函数声明

double sum, atof(char []);
^^^^^^      ^^^^^^^^^^^^^^

同时函数原型被放置在 main 的外部块范围内,尽管您可以将它放在 main 之前。在最后一种情况下,函数原型对整个模块都是可见的。

这样声明函数会更正确

double atof( const char [] );

因为通常这样的函数不会更改作为参数传递的字符串。

还请记住,在标头 &lt;stdlib.h&gt; 中声明了一个同名的标准 C 函数。

double atof(const char *nptr);

【讨论】:

  • "您可以在文件范围或调用该函数的块范围内声明一个函数。"这对我帮助很大。我想就此再问一个问题。如果函数原型被声明在函数之外,那么函数原型位于函数之前还是之后并不重要?例如,结构 void main(void) { {function declaration;} function prototype declaration;} 是否有效?
  • @opol 在调用之前声明一个函数很重要。此外,当前的 C 标准不允许在声明未知时调用函数。
猜你喜欢
  • 1970-01-01
  • 2011-08-07
  • 2012-07-15
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
相关资源
最近更新 更多