构建一个 C++ linux 程序。何时拆分单独的文件与单独的程序

Structuring a c++ linux program. When to break out separate files vs separate programs

c/c++ 相当陌生。我正在为我的 RaPi 和 .net 编写一些代码,这对我来说很容易,但我正在与 c++ 中的设计作斗争。

简而言之,我应该在什么时候将主代码、另一个 cpp 文件和单独的程序分开?

目前我有 2 个程序通过套接字 fifo 相互通信。

PiSocket - 所有互联网通信。 Put、Get 和 signalR 连接。以及从 MainPi 发送和接收数据。

MainPi - 使用 PiSocket 发送和接收数据,处理数据库和执行系统命令(例如 pulling/sending gpio 数据)。

我不确定的是: 基本上有4段代码。主循环、互联网连接、数据库调用和系统命令。 When/how 他们应该被打破吗?我怀疑所有代码加起来会超过 20k 行,但它必须是相当实时的通信(几秒钟内)。

使用套接字进行通信似乎很混乱,所以我认为每一部分都应该是它自己的cpp 文件。同时,PiSocket.cpp 引用 MainPi 是否是循环冗余,反之亦然?或者我应该用自己的线程从 main 中的无限循环调用每个片段吗?还将通过 web/PiSocket 进行代码更新,这可能很重要,但我对此表示怀疑。

当然这很简单,但我的搜索并没有揭示太多,我真的不想以后再重新设计它。

提前致谢

您将两个不同的问题混为一谈:

  • .cpp 文件意味着一个单独的 C++ 翻译单元,这会导致一个单独的 object/library 文件可能会或可能不会 link 在其他 objects 中已经构建

  • .cpp文件自带main()可以产生单独的可执行程序,运行在自己的进程

当你有单独的进程时,你只需要 IPC 机制,如套接字/FIFO。您的问题描述中没有任何内容表明对您有用。

如果我是你,我会把 "piSocket.cpp" 写成一个 Internet 连接库:它可以使用线程在后台执行 comms/processing,并从 [=33] 中的代码调用=] 可以规定可报告事件发生时要调用的函数(例如,数据来自 Internet)。您还需要一个 "piSocket.h" 文件——通常包含类型定义、常量、枚举、函数声明、class 定义、模板 and/or 与 "piSocket" 通信功能关联的内联函数。 header 应该包含在 piSocket.cpp 和 mainPi.cpp 中。

详细信息因编译器而异,但基本构建过程可能类似于:

# compile piSocket.cpp into piSocket.o
g++ -c piSocket.cpp

# compile mainPi.cpp and link in piSocket.o to form myApp executable
g++ -o myApp mainPi.cpp piSocket.o

总之,我会说这会让你痛苦。一个好的替代方案是将所有内容都放在一个文件中,并充分了解该语言以首先使功能正常工作,然后再考虑将文件内容一分为二。如果您无法使功能正常工作,那么了解更好的 "physical design"(分成文件)就毫无意义。