C语言开发

malone1 2008-12-26 11:15:11
有个疑问哈。
在C++中各个基本模块是以类的方式提供。#include该类的头文件就可以引用该类功能。
在C语言中,各个功能是由函数来提供的。个人认为一个项目只要有一个.c文件。包含所有函数就可以了。
在C语言开发中可能会有多个.c文件。他们以什么方式来组合的。如何导出一个.c文件中的函数给另一个包含main()函数的.c文件使用。
最好给个例子看看哈。
...全文
141 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
malone1 2008-12-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lbh2001 的回复:]
C/C++ code
/*f2.h*/
#ifndef _F2.H_
#define _F2.H_
void f2(void);
#endif




C/C++ code
#include "f2.h"
#include <stdio.h>
void f2(void)
{
printf("%s\n%d\n", __FILE__, __LINE__);
}




C/C++ code
#include "f2.h"
#include <stdio.h>

void f1(void)
{
printf("%s\n%d\n", __FILE__, __LINE__);
}

int main(void)
{
f1();
f2();

return 0;
}
[/Quote]
C语言开发中也有.h文件。和C++.h文件有什么不同??
wiowei 2008-12-26
  • 打赏
  • 举报
回复
C不是照样有头文件吗
C也照样有lib和dll吗
从你所说的这一点来说,c和c++没区别;只是C++以类作为模块,而C以功能(也就是函数库)。
yellowhwb 2008-12-26
  • 打赏
  • 举报
回复
一个工程只能有1个main函数,所有的c文件都会被编译成o文件,然后链接,连接的时候,编译器会自动把函数调用映射到函数在obj文件中的地址上,这样就实现了链接的过程!
一个工程有很多c文件,其实是逻辑上的很多个c文件,lz可以把所有文件都放在同一个c文件中,效果是一样的!
既然已经分成了多个c文件,那么比如3个c文件:x.c;y.c;z.c,头文件是“附属品”,可以说,要用头文件的时候再添加也不迟。
x文件中有mm1,mm2,mm3这3个函数
y文件中有nn1,nn2,nn3这3个函数
z文件中有pp1,pp2,pp3这3个函数
假设,mm1用到了nn1,这时,可以添加一个头文件y.h,然后把nn1的声明放到y.h里,并且在x.c中#include "y.h",这样做的目的,是告诉编译器,mm1中的nn1函数是在工程中别的地方有定义的。其实还有一种方法也可以达到目的,就是用extern来声明nn1,在x.c中声明extern xx nn1();这句同样是告诉编译器nn1函数是在工程中别的地方有定义的;
同理在main函数所在的c文件中,要么include其它的头文件,要么extern其它文件中的函数!
至此,所有的c文件都能编译成obj文件了(且不管extern或者include的函数是否存在,obj文件都能编译出来),编译后,就开始链接,这是,就时就开始查找extern或者include的函数是否存在了,这是编译器在全局查找,几十在所有的obj文件中查找,如果找到了唯一的函数入口地址,就能链接成功,如果没找到,或者找到多个入口地址,那么编译器就会报错!
tangshuiling 2008-12-26
  • 打赏
  • 举报
回复
软件工程讲究的是模块之间的“高内聚、低耦合”,就是说模块的内部功能要高度的相似,而模块与模块之间尽可能的排除一些相似度(比如引用相同的变量、相同的数据结构、相同的公共数据块等等).
而楼主企图用一个.c的文件就囊括一个工程的所有功能模块,理论上不是不行,问题是这个.c的文件对以后的软件重用度、维护、测试都将带来莫大的灾难!
设.c文件中包含了A、B、C三个模块,A需要调用B,B需要调用C,而A、C用到了同样的数据结构struct X;A模块是用户交互部分,B模块是主算法部分,C模块是输出部分,试想一下,.c文件由于包含了三个模块体积骤然增大到4w行代码,在做测试之时,楼主发现是公共数据结构出现了问题,于是乎,在4w行浩瀚的代码中去寻找是谁用到了X,又是谁改变了X,是不是在相互调用的时候X又再次发生了改变等等一系列的问题就出来了。
再试想一下如果一开始就把模块进行了划分,并且归为了不同文件,那每个模块就只有原来1/3的大小,排错的时候自然就更简单一点,这里还仅分析了三个模块,如果是更多呢?
nullah 2008-12-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lbh2001 的回复:]
C/C++ code
/*f2.h*/
#ifndef _F2.H_
#define _F2.H_
void f2(void);
#endif




C/C++ code
#include "f2.h"
#include <stdio.h>
void f2(void)
{
printf("%s\n%d\n", __FILE__, __LINE__);
}




C/C++ code
#include "f2.h"
#include <stdio.h>

void f1(void)
{
printf("%s\n%d\n", __FILE__, __LINE__);
}

int main(void)
{
f1();
f2();

return 0;
}
[/Quote]
up
xiaoyisnail 2008-12-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 malone1 的帖子:]
有个疑问哈。
在C++中各个基本模块是以类的方式提供。#include该类的头文件就可以引用该类功能。
在C语言中,各个功能是由函数来提供的。个人认为一个项目只要有一个.c文件。包含所有函数就可以了。
你的认为明显不对,如果linux系统的所有源代码放在一个.c里维护起来要疯掉的
在C语言开发中可能会有多个.c文件。他们以什么方式来组合的。如何导出一个.c文件中的函数给另一个包含main()函数的.c文件使用。
c不是也有头文件吗?一样的啊
最好给个例子看看哈。
3楼给了例子了
[/Quote]

另外分模块现在都是提供动态链接库,windows下dll,linux下so
lbh2001 2008-12-26
  • 打赏
  • 举报
回复

/*f2.h*/
#ifndef _F2.H_
#define _F2.H_
void f2(void);
#endif


#include "f2.h"
#include <stdio.h>
void f2(void)
{
printf("%s\n%d\n", __FILE__, __LINE__);
}


#include "f2.h"
#include <stdio.h>

void f1(void)
{
printf("%s\n%d\n", __FILE__, __LINE__);
}

int main(void)
{
f1();
f2();

return 0;
}
sincor 2008-12-26
  • 打赏
  • 举报
回复
是不是可以写成dll
sincor 2008-12-26
  • 打赏
  • 举报
回复
的确没有想过这个问题 只会点点c++
malone1 2008-12-26
  • 打赏
  • 举报
回复
呵呵。谢谢各位
piaomiaoju 2008-12-26
  • 打赏
  • 举报
回复
我觉得就是 遵守 ODR 准则就好了 。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧