- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在寻找可以帮助我将嵌入式 C 项目组织成“模块”和“组件”的高级构建系统/工具。请注意,这两个术语非常主观,因此我的定义如下。
构建系统/工具应该——
我可以编写自己的构建工具并在上面花费大量时间。但是,这不是我的专业领域,如果有人已经创建了这样的工具,我宁愿不重新发明轮子。
最佳答案
实现这一目标的传统方法是将每个模块的源代码放入单独的目录中。每个目录都可以包含模块的所有源文件和头文件。
每个模块的公共(public)头文件可以放在一个单独的、公共(public)的头文件目录中。我可能会为每个 header 使用从公共(public)目录到相关模块目录的符号链接(symbolic link)。
编译规则简单地声明除了公共(public)目录中的头文件外,任何模块都不能包含来自其他模块的头文件。这实现了没有模块可以包含来自另一个模块的 header 的结果 - 除了公共(public) header (因此强制执行私有(private)屏障)。
自动防止循环依赖并非易事。问题是您只能通过一次查看多个源文件来确定存在循环依赖,而编译器一次只查看一个。
考虑一对模块 ModuleA 和 ModuleB,以及一个使用这两个模块的程序 Program1。
base/include
ModuleA.h
ModuleB.h
base/ModuleA
ModuleA.h
ModuleA1.c
ModuleA2.c
base/ModuleB
ModuleB.h
ModuleB1.c
ModuleB2.c
base/Program1
Program1.c
在编译 Program1.c 时,如果它同时使用 ModuleA.h 和 ModuleB.h,则包含这两个模块的服务是完全合法的。因此,如果 ModuleB.h 包含在同一个翻译单元 (TU) 中,则 ModuleA.h 不会提示,如果 ModuleA.h 包含在同一翻译单元 (TU) 中,ModuleB.h 也不会提示。
让我们假设 ModuleA 使用 ModuleB 的设施是合法的。因此,在编译 ModuleA1.c 或 ModuleA2.c 时,同时包含 ModuleA.h 和 ModuleB.h 是没有问题的。
但是,为了防止循环依赖,必须能够禁止ModuleB1.c和ModuleB2.c中的代码使用ModuleA.h。
据我所知,执行此操作的唯一方法是使用某种技术,该技术需要 ModuleB 的私有(private) header ,上面写着“ModuleA 已包含”,即使它没有包含在内,而且它包含在 ModuleA.h 之前曾经包括在内。
ModuleA.h 的骨架将是标准格式(和 ModuleB.h 类似):
#ifndef MODULEA_H_INCLUDED
#define MODULEA_H_INCLUDED
...contents of ModuleA.h...
#endif
现在,如果 ModuleB1.c 中的代码包含:
#define MODULEA_H_INCLUDED
#include "ModuleB.h"
...if ModuleA.h is also included, it will declare nothing...
...so anything that depends on its contents will fail to compile...
这远非自动。
您可以对包含的文件进行分析,并要求依赖关系的无循环拓扑排序。曾经有一个程序tsort
在 UNIX 系统(和配套程序 lorder
)上,它们一起提供所需的服务,以便可以创建静态 ( .a
) 库,其中包含目标文件的顺序不需要重新扫描存档。 ranlib
程序,最终 ar
和 ld
承担了管理单个库重新扫描的职责,从而使 lorder
特别多余。但是tsort
有更普遍的用途;它在某些系统上可用(例如 MacOS X;RHEL 5 Linux)。
因此,使用 GCC 的依赖项跟踪加上 tsort
,您应该能够检查模块之间是否存在循环。但这必须小心处理。
可能有一些 IDE 或其他工具集可以自动处理这些东西。但通常情况下,只要仔细记录需求和模块间依赖关系,程序员就可以受到足够的纪律来避免问题。
关于c++ - 为嵌入式 C/C++ 项目构建系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7606604/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!