![]() |
1
4
这定义了两对函数,称为
以下是该文件所包含内容的缩写版本:
包含
第一部分定义一些宏,然后包括宏本身。在自我包容方面
在第一次自包含之后,这些宏将被取消定义,然后重新定义为
要做到这一点,一种稍微不那么令人困惑的方法是将所有内容放在外部
更好的方法是创建一个压缩函数和一个解压缩函数,每个函数都接受一个参数来指定级别,而不是使用宏技巧。例如:
|
![]() |
2
1
如果使用得当,这可能是一种有用的技术。 假设您有一个复杂的、性能关键的子系统,它有一个相当小的公共接口和许多不可重用的实现代码。代码可以运行数千行、大约100个私有函数和相当多的私有数据。如果您使用的是非平凡的嵌入式系统,那么您可能会足够频繁地处理这种情况。 您的解决方案可能是分层、模块化和解耦的,通过在不同的文件中对子系统的不同部分进行编码,可以有效地表示和增强这些方面。 使用C,这样做可能会损失很多。几乎所有的工具链都为单个编译单元提供了不错的优化,但对任何声明为外部的东西都非常悲观。 如果将所有内容都放在一个C源代码模块中,那么-
但在编辑此文件时,您也会遇到一个不洁的混乱,并且您会失去隐含的模块性。可以通过将源代码拆分为多个文件并包含这些文件来生成单个编译单元来克服这一问题。 不过,您需要强制实施一些约定来正确管理这一点。这些在某种程度上取决于您的工具链,但一些通用指针是-
|
![]() |
3
1
直列式 27 :
您有条件预处理器指令 164 开始它的“else”部分,在文件末尾结束。这将文件分为两部分:通用fastlz函数的主声明,编译器会对其进行一次解析;第二部分包含两个函数的实现( FASTLZ\u压缩机 和 FASTLZ\u减压器 ). 这两个函数实现的名称恰好是宏定义,它们被文件的第一部分包含了两次,在包含之前不久,一些参数被声明为宏定义(它们的最终名称和其他一些参数)。 这是保持代码干燥的C方式,不要重复两个几乎相同的实现。在C++中(由于添加了C++标记),您还有其他用于相同目的的机制:继承、模板、模板专门化、if constexpr等。 顺便说一句:前面提到过 first if-def line 可能包含错误-它检查是否定义了任何定义,但第一个定义的名称“ FASTLZ\uu压缩机 “包含” __ '而不是' _ '稍后使用。幸运的是,这段代码运行良好,因为选中的定义总是一起定义:)。 |
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 5 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 5 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 5 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 5 月前 |