在我看到的所有代码中,程序总是被分解成许多较小的文件。 对于我在学校的所有项目,我已经得到了一个巨大的C源文件,其中包含我使用的所有结构和函数。
我想学习怎么做是将我的程序分成更小的文件,这似乎是专业的标准。 (顺便说一句,为什么这只是为了方便阅读?)
我一直在搜索,我所能找到的信息都是建立图书馆,这不是我想要做的事情。 我希望我能提供更多帮助,但我不完全确定如何实现这一点 – 我只确定我想要的最终产品。
嗯,这正是你想要的:将你的代码分成几个库!
让我们举一个例子,你有一个文件:
#include int something() { return 42; } int bar() { return something(); } void foo(int i) { printf("do something with %dn", i); } int main() { foo(bar()); return 0; }
你可以把它分成:
mylib.h:
#ifndef __MYLIB_H__ #define __MYLIB_H__ #include int bar(); void foo(); #endif
注意:上面的预处理器代码称为“guard”,用于不运行此头文件两次,因此您可以在多个位置调用相同的include,并且没有编译错误
mylib.c:
#include int something() { return 42; } int bar() { return something(); } void foo(int i) { printf("do something with %dn", i); }
myprog.c中:
#include int main() { foo(bar()); return 0; }
编译它你做:
gcc -c mylib.c -I./ gcc -o myprog myprog.c -I./ mylib.o
现在的优势?
它只是为了方便阅读?
主要原因是
它只是为了方便阅读?
不,它还可以节省你很多时间编译; 当您更改一个源文件时,您只需重新编译该文件,然后重新链接,而不是重新编译所有内容。 但重点是将程序划分为一组分离良好的模块,这些模块比单个单片“blob”更容易理解和维护。
对于初学者来说,尽量遵守Rob Pike的“数据占主导地位”的规则:围绕一堆数据结构(通常是struct
)设计程序,并对其进行操作。 将属于单个数据结构的所有操作放入单独的模块中。 使所有函数static
,不需要由模块外部的函数调用。
易于阅读是分解文件的一个方面,但另一个方面是,当您构建包含多个文件(头文件和源文件)的项目时,良好的构建系统将只重建已修改的文件,从而缩短构建时间。
至于如何将单个文件分解为多个文件,还有很多方法可以解决。 对我来说,我会尝试对function进行分组,例如,所有输入处理都放在一个源文件中,在另一个源文件中输出,以及在第三个源文件中由许多不同函数使用的函数。 我会对结构/常量/宏,组相关结构/等做同样的事情。 在单独的头文件中。 我还将仅在单个源文件中使用的函数标记为static
,因此不能错误地使用其他源文件。
只是为了给你一个主意。
创建一个名为print.c的文件,将其放入:
#include #include #include void print_on_stdout(const char *msg) { if (msg) fprintf(stdout, "%sn", msg); } void print_on_stderr(const char *msg) { if (msg) fprintf(stderr, "%sn", msg); }
创建一个名为print.h的文件,将其放入:
void print_on_stdout(const char *msg); void print_on_stderr(const char *msg);
创建一个名为main.c的文件,将其放入:
#include #include #include #include "print.h" int main() { print_on_stdout("test on stdout"); print_on_stderr("test on stderr"); return 0; }
现在,对于每个C文件,编译为:
gcc -Wall -O2 -o print.o -c print.c gcc -Wall -O2 -o main.o -c main.c
然后链接编译的文件以生成可执行文件:
gcc -Wall -O2 -o test print.o main.o
运行./test并享受。
好吧,我不是专家,但我总是试着在更大的实体中思考一个函数。 如果我有一组逻辑上属于一起的函数,我将它放在一个单独的文件中。 通常,如果function类似,并且有人想要这样的function之一,他可能也需要该组中的一些其他function。
分割单个文件的需要来自于为文件使用不同文件夹的相同原因:人们希望在众多function上拥有一些逻辑组织,这样他们就不需要为大型单个源文件进行grep找到所需的一个。 这样,当您考虑/开发一些固定部分时,您可以忘记程序中不相关的部分。
拆分的另一个原因可能是你可以通过在标题中没有提到它来隐藏代码的其余部分的一些内部函数。 这种方式明确地将内部函数(仅在.c
文件中需要)与有趣的函数分离到程序的外部“Universe”。
一些更高级的语言甚至将“function归属于一起”的概念扩展为“作用于同一事物的function,作为一个实体呈现” – 并称之为一个类 。
拆分的另一个历史原因是单独的编译function。 如果您的编译器很慢(例如,通常是C ++的情况),将代码拆分为多个文件意味着如果只修改一个位置,则只需要重新编译一个文件以获取更改的可能性很高。 由于现代C编译器与典型处理器速度相比并不慢,因此对您来说这可能不是问题。
需要了解更多c/c++开发分享如何将单片程序拆分为较小的单独文件?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享如何将单片程序拆分为较小的单独文件?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/979537.html