0

可能重复:
没有头文件的 C 程序

我已经学习 C 很长时间了。但困扰我的一件事是,今天我做了一个 C 程序,忘记包含我将文件保存为 kc.c 的 stdio.h 和 conio.h 头文件?当我编译并运行这个 .c 文件时,输出与我预期的一样。

但是如果不使用标准头文件,C 程序如何运行呢?

或者我不知道我错过的概念?

编辑:程序

int main()
{
  int i=12,j=34;
  int *pa=&i,*pb=&j;
  printf("the value of i and j is %d %d respectively ",*pa,*pb);
  getch();
  return 0;
}

因为我在这里使用了 STDIO.H 头文件的 printf() 函数,但是不包括它如何编译并成功运行?

4

3 回答 3

5

允许编译器使事情工作,但没有义务这样做。

您应该在使用它们之前声明所有变量参数列表函数;未printf()正确声明会导致未定义的行为(一种有效的未定义行为是按预期工作)。

如果您在 C99 模式下编译,您应该会收到有关未声明函数的警告(但 Turbo C 可能没有 C99 模式)。


挑剔:

[H]不使用标准头文件如何运行C程序?

所有程序都在不使用任何标题的情况下运行。但是,大多数程序是使用标准头文件编译的以声明标准函数,并且更好的程序确保所有函数在使用之前都被声明(或者在使用之前被定义为静态函数)。

C99 需要这个,尽管许多编译器允许编译错误的程序。但是,编译应该产生诊断;诊断可能会也可能不会导致编译失败。在实践中,它通常不会导致编译失败,但它可以并且使用某些编译器(例如 GCC),您可以强制编译器(例如使用 GCC 的-Werror=missing-prototypes -Werror=old-style-definition选项)。

于 2012-09-09T06:12:27.253 回答
2

当应用的语言标准早于 ISO C99 时,C 不需要在引用之前声明或定义函数。

但是,当编译器遇到这样的函数调用时,它只是假设该函数返回一个 int 并且它采用不确定数量和类型的参数。这称为隐式声明。如果您稍后声明该函数,或使用不同数量的参数或不兼容的参数调用它,您可能会在某些编译器中收到警告,即第二次调用与第一次隐含的声明不匹配,但 ISO C89 标准将该函数视为可变参数 [like printf()] 允许任意数量和类型的参数。

此外,如果实际返回值不是 int,则任何接受和处理的返回值都可能没有多大意义。

It is bad form to rely on an implicit declaration, and most compilers would issue a warning. If your compiler did not, you need to increase the warning level; those diagnostics are there to help improve your code quality. If you simply ignored the warning (any warning for that matter), then you shouldn't!

In C++ the rules are tighter and failure to declare or define a function before referencing it is an error, since it is necessary to allow function overloading.

于 2012-09-09T06:15:29.330 回答
1

头文件只不过是常量、预处理器宏和函数原型的列表。函数原型告诉 C 每个函数需要什么参数。

如果编译器看到正在使用的函数没有相应的原型或函数定义,它会生成一个形式为的隐式声明int func()。由于 C 函数仅通过名称而不是函数签名(与 C++ 一样)链接,因此链接器稍后会在标准库中定位函数定义。

于 2012-09-09T06:13:49.953 回答