Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C项目文件和模块化组织_C - Fatal编程技术网

C项目文件和模块化组织

C项目文件和模块化组织,c,C,C项目文件和模块化组织 我一直在搜索,如果没有一个组织C项目的新程序员的技术术语,我就找不到理智的答案样本 我可能因为没有搜索技术词汇来描述这一点而遇到问题。重新分解、模块化编程和项目组织 关于如何组织项目的示例,我只是对头定义层次结构和源/头文件之间的作用域感到困惑 -main.c- #include “project_headers.h” int main(void) { int errorCode = runProgram(); if(errorCode != 0)

C项目文件和模块化组织

我一直在搜索,如果没有一个组织C项目的新程序员的技术术语,我就找不到理智的答案样本

我可能因为没有搜索技术词汇来描述这一点而遇到问题。重新分解、模块化编程和项目组织

关于如何组织项目的示例,我只是对头定义层次结构和源/头文件之间的作用域感到困惑

-main.c-

#include “project_headers.h”

int main(void)
{
    int errorCode = runProgram();
    if(errorCode != 0)
    {
        storeError(“Error while running program”, errorCode);
    }
return errorCode;
}
-项目标题.h-

#include <SDL.h>
#include <stdio.h>
// and any other header I might need
-初始化.c-

#include “project_headers.h”
int initSDLstuff()
{
}

int initWindow()
{
}

int initialize()
{
    int errorCode = 0;
    if(initSDLstuff() != 0)....
    if(initWindow() != 0)....
    return errorCode;
}
这种粗俗的方法不行,我试过了。未定义的引用超出范围等问题

我是一个第一次就把它做好的超级粉丝,我会仔细思考事情,阅读文章、文章、how-too's,甚至像K&R style这样的辩论是与其他人相比的唯一方式

我不希望这变成一个固执己见的答案,我会尽量缩小范围

我希望我的“C”编码是现代的、模块化的、简单而优雅的 我希望能够在教程之外编写代码,任何团队、员工或人类都会看到并说!哇,干得好,我想修改X,但一切都正常

我找了一些好的源代码作为参考,有人说要看《末日》或Linux内核,发现它们对我的经验有点过头了,可能不是什么“现代”风格

我不是在寻找那些只会让人眼花缭乱的超级优化代码。如果有人知道伟大的“C”项目的任何参考资料,那就太棒了。我可能感兴趣的一些示例项目包括图像加载/保存程序、计算器、简单的3d模型查看器、能够保存和加载的简单文本编辑器。我已经看过很多源代码,但是对于一个没有经验的程序员来说,很难分辨什么是好的和坏的实践,我真的不想纠正坏习惯

很抱歉这个冗长的问题,我尽了最大的努力来缩小它的范围,这样它就不会固执己见了

1.C项目文件和模块化组织?可以使用我的示例代码作为示例 2.好的简单C项目/源代码,具有现代、模块化、简单和优雅的性质? 谢谢

以下是项目布局的非技术性说明

一,。所有术语都可以归结为保持代码干净、可读和可维护,这样在100000或1000000行源代码中导航不会干扰您的编码思维过程。如果您在源代码中迷失了方向,那么是时候考虑将代码配对,并将类似的代码放在单独的文件中

二,。什么去哪里?嗯,把逻辑上相关的东西放在一起。如果您有一个简短的项目,那么可能根本不需要拆分代码。另一方面,如果您正在使用抽象数据结构进行数据处理,例如链表等,那么将数据处理结构和功能拆分为单独的标题和源代码是有意义的,这样您的主源代码就不会被1000行的列表操作代码弄得乱七八糟。如果这是一个科学项目,其功能与轨道力学有关,那么将这些程序分离也是有意义的。基本原则是把所有的东西放在一起。这不仅提高了可维护性,还提高了可重用性。如果您有另一个项目需要相同的轨道力学例程,那么您可以重用已经创建的源代码和标题,而不是每次都重新创建轮子

三,。随着自定义代码库的增长,将类似的函数分组到它们自己的文件中可能是有意义的,这些文件可以稍后转换为库,也可以随时使用。如果您有一组提供二进制输出表示和/或处理的位操作的函数,那么将它们放在一起可能会有意义。与文件/目录例程相同。字符串操作例程也是如此。不管逻辑分组对您有什么意义,并且有助于保持代码的干净性和可维护性,这都有助于将代码保持在一起

四,。另一个考虑事项是数据隐藏/保护和功能访问。通过将数据拆分为单独的标题,您可以在一定程度上控制C中哪些函数以及哪些源文件可以访问哪些数据,具体取决于您是否通过标题包含使这些数据可用。有关此功能的使用范围的极端示例,请参阅

五,。什么时候是分手的好时机?在这里,当你开始一个项目时,你要么拥有那些你已经分割的,你计划使用的,你带来的,或者你发现你自己基本上是从一个文件原型。随着该文件的增长,当您花费脑力在文件中搜索functionX或variableY时,可能是时候看看您是否可以清理代码,并通过将类似代码收集到一个单独的文件中来简化工作。你是一个 你是法官。如果你是一个可以在不丢失逻辑流、位置等信息的情况下切割100000行的人,那么你就无法到达收集和分离点的时间可能比其他人晚得多。这才是适合你的


还有其他考虑因素,毫无疑问还有6-500个,但这就是为什么要在不同的头文件和源文件之间分割代码的原因。在学习过程中,您经常会看到一些示例,其中代码在文件之间很好地分割,没有其他原因,只能说明代码可以在文件后面完成。如果在3个函数和2个变量中有27行代码,则没有理由拆分任何内容,但您将在示例之后找到这样做的示例-只是为了展示如何划分数据和代码。这并不意味着当你到达第28行时,你需要开始分裂。做适合你的事。

答案相对简单,但细节取决于你,系统设计师:


为每个.c文件创建一个.h文件 仅在需要时包含特定的头文件 从顶级项目目录, 创建包含所有.h文件的子目录。include是一个通用名称 创建包含所有.c文件的子目录src是一个通用名称 在makefile的顶层项目目录中, 定义具有.h文件路径的宏 定义具有源文件路径的宏 定义一个宏,该宏具有放置.o文件的路径 定义一个宏以保存任何其他文件 例如.d依赖项文件 在gcc编译语句中使用这些宏 在gcc链接器语句中使用.o宏
你想做多少过度工程?@self我相信这是我的问题,我只是想把它做好,而不是被称为那些糟糕的程序员之一。没有过度设计,只是一个好的工作流程和风格。为什么它当然不起作用?我假设你也把所有的函数原型都放在头文件中,对吗?@ooga你说得对!但问题并不在于这段代码是否真的有效,更多的是我应该在哪里/如何组织函数原型,而不是使用全局函数,或者我被教导这样做。要么我有一个混乱的包含所有指令、宏、原型和全局变量的巨大头文件,要么我在指针参数和文件组织上苦苦挣扎。在什么是圣杯(holy grails)上引用经验丰富的程序员的伟大项目会很棒。为每个.c文件创建一个.h文件-真的吗?这没有任何意义,通常整个项目都有一个或两个h文件——剩下的建议是spoton@user3629249谢谢你迅速的回答!快速提问,probley只是看错了。1.二,。您提出的观点相互矛盾,或者您的意思是在需要时仅包括库头文件sdl.h作为示例?这是一种系统设计者的方法还是一般的良知。还为每个*.c创建一个单独的头文件。我是否会将main中使用的X原型的所有头文件指令放在main中,或者将它们全部放在与Z项目相关的所有头文件中?@pm100:如果仅定义1或2个头文件,则会更改任何单个文件,比如说,更改新的或修改过的接口函数将导致相应的头文件被更改。这导致整个项目被重新编译。整个项目正在重新编译,这是对资源的极大浪费。尤其是在现实中,通常只有几个源文件需要更改。试想一下,对于一个包含数百甚至数千个源代码的项目,这会产生怎样的影响files@abflett:我是说,每个源文件都有一个单独的头文件。然后只包含实际需要的头文件。这样做的目的是最大限度地减少更改文档所需的重新编译量code@Mr.谢谢你详细的回答。不仅针对非技术术语,而且还提供了一个极端的例子,同样的,做自己喜欢做的事情。我相信我可能是想得太多了,你的回答让我有信心回到正轨。很高兴我能帮上忙。C是一种精确的语言,您应该继续努力深入理解它。这恰好是你在剩下的时间里有灵活性的一部分——像你在回答这个问题一样不断地攻击它,你会做得很好。
#include “project_headers.h”
int initSDLstuff()
{
}

int initWindow()
{
}

int initialize()
{
    int errorCode = 0;
    if(initSDLstuff() != 0)....
    if(initWindow() != 0)....
    return errorCode;
}