C语言中的隐式声明

时间:2017-05-28 10:25:46

标签: c

请考虑Dennis ritchie的C书中的以下引用

  

所有变量必须在使用前声明,尽管是确定的   声明可以由内容隐含地进行。

众所周知,任何类型的所有变量必须在进一步使用之前声明。我不知道声明的后半部分可以隐式地做出某些声明 按内容

在C中,一般来说,变量属于char,int,float,double四种基本数据类型。如何在没有任何声明之前使用这些数据类型的变量。请提供一个示例,显示基于变量保存的内容的隐式声明。

2 个答案:

答案 0 :(得分:9)

通过“某些声明”,作者意味着声明不是变量的事物。在编写本书时,C允许隐式声明函数:编译器只是假设函数返回整数。现代C标准使这种声明非法。

答案 1 :(得分:3)

当编写第一版K& R时,没有C标准。当编写第二版K& R时,C89 / C90标准即将完成。由于C89最终确定之前编写的代码遗留问题,标准必须允许:

#include <stdio.h>

double sqrt();

main(argc, argv)
    char **argv;
{
    if (argc > 1)
        printf("sqrt(%s) = %f\n", argv[1], sqrt((double)atoi(argv[1])));
    else
        printf("sqrt(%.0f) = %f\n", 2.0, sqrt(2.0));
    return 0;
}

请注意,main()的返回类型是隐式int;函数参数argc隐式int;函数atoi()的隐式返回类型为int。另请注意,sqrt()的参数必须明确为double值;编译器无法自动转换参数类型,因为原型在C89标准之前不是C的一部分。

C99或C11编译器不再接受此类代码。你可以使用:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    if (argc > 1)
        printf("sqrt(%s) = %f\n", argv[1], sqrt(atoi(argv[1])));
    else
        printf("sqrt(%.0f) = %f\n", 2.0, sqrt(2));
    return 0;
}

这使用标准头来声明具有完整原型的函数,因此不再需要将参数强制转换为sqrt()。在C99或C11中,可以省略return 0;,效果会相同。就个人而言,我不喜欢允许这样做的漏洞并继续明确地写回报。在C90中返回是必要的,以向环境发送确定状态(例如,调用程序的shell)。