c文件头文件函数声明,c中头文件中声明的函数在哪存在的

1,c中头文件中声明的函数在哪存在的比如你把环境安装在C:\Devcpp里面那么头文件就在C:\Devcpp\include里面C运行时库文件由于版权原因,库函数的源代码一般是不可见的 , 但在头文件中你可以看到它对外的接口 。库函数是人家写的程序,你拿来用在你的程序里.【c文件头文件函数声明,c中头文件中声明的函数在哪存在的】
2,用c编程时如果在头文件里定义了几个函数需要在那个头文件里用extern 是外部的意思 。如果 在头文件里 写的只是 几个函数的原型声明,而函数定义在别的文件中,则可以加 extern 。编译器 做 链接时 会到 外面(.obj 或库)去找 。如果 在头文件里 写了完整的函数定义,那么 , 它就不是外部函数 。不能加extern 。一般情况下 , 好象不用写extern,编译器在本程序找不到,自己会到库里找,找不到会报错 。VC++编译器 。
3,C语言头文件的函数都定义在哪里正常的函数是不可以在头文件中定义的,除非你将函数定义成内联函数 。在定义函数的时候,前面加上inline 就可以了 。如: inline int a() { } 但是内联函数是C++里面的,可能C的编译器会不支持 。如果你的编译器不支持,你可以使用宏来代替内联函数,宏是可以定义在头文件中的 。出现该错误的原因为编译时只变编译了源文件的一部分,故在链接时无法从编译好的目标代码中找到print函数,所以出错 。根据你的源文件结构,个人推荐先单独编译源文件为多个object文件 , 再统一链接 。方法如下 gcc -c main.c # -c参数的作用是让gcc只编译 , 不链接 gcc -c test.c gcc -o main main.o test.o # 将编译好的目标代码链接当然,以上是在gcc为编译器的前提下执行,如使用clang等其他编译器,方法类似(clang的调用方法与gcc高度兼容)
4,C头文件中函数声明定义定义只能有一次,而声明的次数不限 。任何标识符在使用前至少要有声明,将声明放在头文件中,就可以在需要使用到标识符时随时把头文件包含进来即可 。如果把定义放进头文件中,那每包含一次头文件,标识符就定义了一次 , 这样在多文件的编译连接时很容易出问题的 。包含其实就相当于把被包含文件的内容加入到其中 , 和用被包含文件中的内容替换掉对应的包含语句没有区别 。使用头文件的好处就是免除了重复劳动的麻烦 。反正最终编译器都是把被包含文件的内容合并到一块才编译的 。所以这样,LZ觉得运行时的调用跟调用任何一个函数有区别吗 。一个函数可以申明多次,可是只能定义一次,这是规定 。应该将定义都放到.cpp中 。.h中只放声明就没事了 。如果是全局变量,就在.h中用extern声明,然后在.cpp中定义就是了 。c++这个词在中国大陆的程序员圈子中通常被读做“c加加” , 而西方的程序员通常读做“c plus plus” , “cpp” 。它是一种使用非常广泛的计算机编程语言 。c++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言 。它支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格 。最新正式标准c++于2014年8月18日公布 。其编程领域众广,常用于系统开发,引擎开发等应用领域,是至今为止最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性 。其实 , 网上有很多类似的文章,随便百度一下就可以查明白,虽然明白 , 但我还是帮你百度了一下系统的文章 。C++/C源程序通常分为两类文件 。一类文件用于保存程序的声明,称为头文件;另一类文件用于保存程序的实现,称为源文件(或者定义文件) 。编译器在扫描到一条函数调用语句时首先应当知道该函数的原型或定义,函数原型一般都放在头文件中,函数定义则放在源文件中 , 当源文件或头文件通过#include指令包含另一个头文件的时候,编译预处理器用头文件的内容取代#include伪指令 。这就是说,头文件的所有内容最终都会被合并到某一个或某几个源文件中 , 如此将每一个包含的头文件递归地展开后形成的源文件就叫编译单元 。如果象你说的,直接在头文件中定义函数的执行代码,也是可以的,但这会造成编译单元多了一些不必要的代码 。头文件的主要作用如下:1)通过头文件来调用库功能 。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可2)头文件能加强类型安全检查 。如果某个接口被实现或被使用时的方式与头文件中的声明不一致 , 编译器就会指出错误3)头文件可以提高程序的可读性(清晰性) 。5,C语言函数声明的问题我也来 说几句 。。标准编译器 对函数的调用 都要先申明 才能 调用 (生产的时候就这样设定的) 。。我推荐试用大点的vs2005,vc2000.小点的Dev-cpp ,Turboc 3.0 (2.0 不支持鼠标有点 麻烦)这里 就涉及:申明和定义之间的区别 。申明-- 不开辟内存,仅仅告诉编译器,申明的部分存在,要预留一点空间 。定义-- 开辟内存 。申明 属于 预编译范畴的 。最好写在头文件中(楼主 , 自定义头文件学了没有?。浚ㄉ昝鞫夹丛谕肺募校皇且恢趾玫谋喑滔肮撸?因为 在编译的时候,编译器先处理一些特殊数据(宏定义 , 函数的申明,变量的申明),在这个过程中 , 编译器 通过申明 可以预测整个定义需要的内存大小,并且 把这些大小预留起来 , 留给定义的时候使用(因为虽然定义,但是在 main函数里面没有调用,一样的不分配内存) 。如果不事先申明,直接定义,有可能会造成系统崩溃 , 出现内存不足,不能分配 。然而现在内存都是1G左右了,所以一般空间都足够,所以你也可以不申明直接定义函数 。但是一旦内存紧张,就会出错,而且程序简洁性就很低 。(不看到定义,还不知道原来还定义了这么一个函数?。。。┗褂?变量也一样,标准的都是 先申明在定义 。extern int i; //申明int i=0; //定义并初始化为0int i; //定义. 。。。。。。。。。。。。。。。。。所以 从现在其要养成良好的编程习惯 先申明 , 在定义 。申明最好都放在 一块,并且都在头文件中(为了便于管理) 。可以直接定义 但是必须在调用的前面定义 但是声明很明显说明这里有一个函数 下面可能需要调用第一,如果你没有看错就是你的书错了 , 只有int和char类型的函数不必声明 第二,C中可以不声明函数的条件是3个 1就是上面我说的 2.是被调函数定义在主调函数之前,可不必声明 3函数的外部已声明过了 , 个个主调函数中不必声明 对于第二点,很好解释,因为声明的目的在于告诉编译器有这么个自定义函数,返回类型是什么,如果被调函数定义在主调函数之前 , 那么编译器自然就知道了这个函数 你把f2和f1换下位置并去掉声明就明白了 再说一句,写函数声明是编写程序的良好习惯 请注意这是C程序 , C官方声明标准编译器是Turboc 2 。0 不要把C++的概念强加给C 我不是说VC++6不好,而是说既然是在学C,就要用标准的C编译器,只有标准C编译器才能正确的学习C的基础理论C语言规定,所有的函数被调用之前都必须声明.声明格式为 -- 存储类型 数据类型 函数名(参数)定义一个变量是可以直接定义使用的,但也必须在使用之前定义啊.所以,还有另外一种形式可以不用声明函数,那就是把函数的定义部分放在主函数的上面.这是这是因为C程序都是从main()函数开始执行的,而且是从上往下执行.比如#include<stdio.h>float add(float x,float y) /*定义add函数*/ float z; z=x+y; return z; } void main() float a,b,c; scanf ("%f,%f",&a,&b); c=add(a,b); printf("sum is %f\n",c); }等C官方声明标准编译器是Turboc 2 。0?????这个好像有点假吧,如果标准是turboc 2.0,我感觉靠c语言吃饭的人都能改吃屎了 。现在的标准是C99,tc还是89年的产物呢,比较新的编译器应该是gcc 4.x,无论是你真正的学c吃饭,还是过2级,都不会与现在的标准c冲突的 。看你的程序可以看出,你看的书够老的了,把函数声明放在main()函数里,很少有这样用的 , 函数不用声明的用法只有一种 , 就是在主函数前面定义 。正常在程序设计中,函数声明是个好习惯 。在以后的学习中你会体会到的 。c语言是这样规定的,你记住了就行了 。

    推荐阅读