可能重复:
C program without header
我一直在学习C语言。但是困扰我的一件事是,今天我做了一个C程序而忘记包含stdio.h和conio.h头文件我把文件保存为kc.c?当我编译并运行这个.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()函数,但没有包括它如何编译并成功运行?
答案 0 :(得分:5)
允许编译器使工作正常,但没有义务这样做。
你应该在使用之前声明所有变量参数列表函数;不声明printf()
正确导致未定义的行为(并且一个有效的未定义行为将按预期工作)。
如果在C99模式下编译,你应该收到有关未声明函数的警告(但Turbo C可能没有C99模式)。
NIT-采摘:
[H] ow可以在不使用标准头文件的情况下运行C程序吗?
所有程序运行而不使用任何标头。但是,大多数程序使用标准头文件编译来声明标准函数,更好的程序确保所有函数在使用之前声明(或在使用之前定义为静态函数)。
C99需要这个,尽管许多编译器都允许编译错误的程序。但是,汇编应该产生诊断;诊断可能会也可能不会导致编译失败。在实践中,它通常不会导致编译失败,但它可以和一些编译器(例如GCC)一起强制编译器(例如使用GCC的-Werror=missing-prototypes -Werror=old-style-definition
选项)。
答案 1 :(得分:2)
当在ISO C99之前应用语言标准时,C在引用之前不需要声明或定义函数。
然而,当编译器遇到这样的函数调用时,它只是假设函数返回一个int,并且它需要一个不确定的数量和参数类型。这称为隐式声明。如果您稍后声明该函数,或使用不同数量的参数或不兼容的参数调用它,您可能会在某些编译器中收到警告,第二次调用与第一次调用所暗示的声明不匹配,但ISO C89标准将该函数视为variadic [like printf()],允许任何数量和类型的参数。
此外,如果实际的返回值不是int,那么接受和处理的任何返回值可能都没有多大意义。
依赖隐式声明是不好的形式,大多数编译器都会发出警告。如果您的编译器没有,则需要提高警告级别;这些诊断可以帮助您提高代码质量。如果你只是忽略了警告(对此事的任何警告),那你就不应该!
在C ++中,规则更严格,在引用它之前声明或定义函数失败是一个错误,因为必须允许函数重载。
答案 2 :(得分:1)
头文件只不过是常量,预处理器宏和函数原型的列表。函数原型告诉C每个函数需要什么参数。
如果编译器在没有相应原型或函数定义的情况下看到正在使用的函数,它将生成int func()
形式的隐式声明。由于C函数仅通过名称而不是函数签名(如C ++的情况)链接,因此链接器稍后将在标准库中定位函数定义。