在大括号中声明函数原型

Declaring a function prototype in a brace

在'The C Programming Language(2nd)'71~72p,

Second, and just as important, the calling routine must know that atof returns a non-int value. One way to ensure this is to declare atof explicitly in the calling routine.

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

#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()中呢?虽然我是新手,但是没见过这样的。

对于早期 C 版本的初学者,您可以调用函数而无需在函数调用之前声明它。在这种情况下,默认情况下假定该函数具有 return 类型 int.

注意函数声明一般不需要提供函数原型。

比较这两个函数声明

int f();

int f( void );

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

第二个声明确实是一个函数原型,这意味着该函数没有参数。

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

要告诉编译器该函数具有不同的 return 类型,您需要在函数调用之前声明该函数。

您可以在文件作用域或调用函数的块作用域中声明函数。

这个函数声明

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

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

像这样声明函数会更正确

double atof( const char [] );

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

另请记住,在 header <stdlib.h>.

中声明了一个同名的标准 C 函数
double atof(const char *nptr);