关于C语言的一个问题,高手请进

比如说我有三个c文件,两个个h文件,main.c,a.c,a,h,b.c,b.h。
a.c中有一个函数a();,为了给别的文件调用,在a.h中添加了extern void a();
b.c中有一个函数b();,为了给别的文件调用,在b.h中添加了extern void b();
现在是a();中调用b();所以在a.c 开头#include b.h;
main.c中main()想调用a();,在main.c开头#include a.h,还要#include b.h吗?
哥们,请确定自己是对的再回答好吗?四个答案2个说要2个说不要,好迷茫啊!

好吧,我来回答吧,其实是不需要的,我还特意测试了一下,编译成功而且调用过程都没有问题

解释一下,a.c文件中调用了b()函数,a.c包含了b.h头文件,所以a.c文件能正常调用b()函数,这点大家应该都没有问题,但main()中通过调用a()来间接调用b()函数需不需要b()的头文件呢,答案是不需要的,从编译过程中,我们知道,编译器把a.c、b.c和main.c分别编译成a.o、b.o和main.o的目标文件,然后分别将a.o和b.o和main.o链接成可执行程序。通过回顾编译过程,就非常好理解了,main.c中调用了a(),所以只要#include “a.h”告诉编译器a()函数是在别处定义的(这里是在a.c中定义)即可,至于在a()函数中调用了b()函数,只要在a()函数定义处添加#include "b.h"即可,与main.c文件是没有关系的。


用事实说话!

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-05-04
如果b()没有在main.c中被直接调用,就不必包含b.h
不用迷茫,100%肯定不需要
第2个回答  2014-05-04
不好意思,看错了,以为你问的是关联包含。如果你a.h 包含 b.h,c.h 包含 a.h,那么c.h肯定是包含b.h中的函数的。但你用的都是*.c文件中包含其他的头文件,这个应该还是要加一句#include "b.h",头文件和源文件不建议你掺合写,如果你要想省事,你就在a.h中包含b.h,不要到a.c中去包含
第3个回答  2014-05-04
要。
但如果你在a.h中写了#include "b.h",就不用了。
第4个回答  2014-05-04
不需要,c语言函数都是全局函数。
第5个回答  2014-05-04
要,因为你a.h中没有#include "b.h" 。

C语言高手请进来11
第一题:运行后,循环第一轮后输出8,第二轮后输出7,第三轮输出6,第四轮时达到要求退出循环,结束程序。选B 第二题:这个是找出小于等于50的整数中能被2、3、7整除的数,这个题直接从答案里找一个,所以选C 第三题:运行到这个时for(j=0;j < 3;j++){ if(j%2) continue;x++;} x++ ...

高分C语言问题~~·高手请进
int getValue(int A[]){ 初始 int S=0 1. (数组A)n个数字从小到大排序 (例如:1,2,9)2. 取上步中最小的两个数相加之和为一个M , S=S+M 3. 数组A中除去最小的两个数,然后将M加进去形成一个新数组A元素个数为 n=n-1 4. n>1时回到1.否则函数返回S+A[0] (或S+M,因为最...

编程高手请进!(C语言)
printf("\\n NEXT?(Y\/N):");\/*选择是否重新游戏*\/ scanf("%c",&yes);} } 2.include <stdio.h> void main(){ int gj, mj, xj, t1, t2;for (gj=1; gj<=20; gj++){ for (mj=1; mj<34; mj++){ xj=100-gj-mj;t1=xj%3;t2=5*gj+3*mj+xj\/3;if (t1==0&&t2==100...

c语言问题,高手请进谢谢!!!
1、++i 时i加1得到i,此时的i=2;2、++i 时i加1得到i,此时的i=2+1=3;3、此时前面有两个i等待运行,即i+i--->这两个i些时都是3;而不是一个2,一个3;4。再一个++i 此时i加1得到i,i=3+1=4;由上面的理解知道i此时已经是4,5、由上面四步得到一个i=4,i+i+i的式...

c语言二级问题,请高手详细解答下
先根据运算符优先级,原式等效于 y=(--x||++y);||运算符的短路效应,--x值为非零,所以子表达式--x||++y值为1,且后半部分的++y未执行,因此y值为1

C语言中的一个问题: i=3; s=(++i)+(++i)+(++i); 请问:s=?
1、第一个++i 和第二个++i 同时执行得到 i = 5。2、然后5+5 = 10。3、再将10 与第三个++i 相加。4、此时i = 6所以最后i = 16。你应该会对第一步不解。做加法时要先求两边表达式,所以前两个++i 是同时运行的。因为只有一个变量i ,所以运算结果只能存一个,即最后的结果,两个++i...

请教C语言高手为小弟解答的疑惑
1,int* pN=&N;pN是一个指针,这个指针指向N,指针的值是存放数据N的内存的首地址;2,int* pN=N;pN也是一个指针,指针的值是就是N;这种用法是不合适的,因为你一般不知道这个指针指向的内存内容是什么。如果真要用的话,可以写成这样:int* pN=(int*)N。3,int* pIndex=nArray;这种写法...

c语言高手请进
数据宽度既是指你的数据带宽,跟数据精度没什么关系,数据精度简单理解就是数值的小数点后有多少位,比如1.23456比1.2345678精度小。把数据线想成马路,数据宽度你可以理解为车道的宽度,4车道同时只能有4辆车开过,而8车道呢,呵呵。=== 迷糊了,你说的应该是数据输出宽度吧。比如这样的输出语句:pr...

关于C语言的一个问题,高手请进
好吧,我来回答吧,其实是不需要的,我还特意测试了一下,编译成功而且调用过程都没有问题 解释一下,a.c文件中调用了b()函数,a.c包含了b.h头文件,所以a.c文件能正常调用b()函数,这点大家应该都没有问题,但main()中通过调用a()来间接调用b()函数需不需要b()的头文件呢,答案是不需要...

请C高手进来,c语言改错考试题,谢谢^_^
1.第一个问题是考察int *const与int const*的区别。int *const ptr表示指向一个整形的静态指针,也就是说ptr指向的值(*ptr)可以变,但ptr不可以变。因此ptr=&y;是不正确的。而int const *(即const int *)表示指向静态整形的指针,也就是说ptr指向的值(*ptr)不可以变,但ptr可以变。答案...

相似回答