这些C指令在做什么以及为什么这个库以这种方式构建?

时间:2017-07-10 15:52:48

标签: c c-preprocessor software-design

我导航following library,我无法理解多个功能如何工作,他们在做什么,以及为什么以这种方式构建库。该库提供加密工具。

例如,在包含测试的文件中,对象g1_t按以下方式初始化:

g1_t a;
g1_new(a);
g1_null(a);

发现于:test_pc.c

函数g1_new()g1_null()以及许多其他函数被定义为宏,例如:

#define g1_null(A)          CAT(G1_LOWER, null)(A)
#define g1_new(A)           CAT(G1_LOWER, new)(A)

发现于:relic_pc.h

其中CAT又是一个定义为:

的宏
#define CAT(A, B)           _CAT(A, B)

随后,

#define _CAT(A, B)          A ## B

发现于:relic_util.h

此外,G1_LOWER定义为:

#define G1_LOWER            ep_

发现于:relic_pc.h

我理解基本的预处理指令。例如,我知道##正在连接两个令牌。但是,我无法看到这些指令如何能够创建/取消(在许多其他事物中)对象g1_t。这种设计形式对我来说很陌生。任何人都可以提供一些见解,了解这些指令的作用以及为什么软件以这种方式构建(即优势)?

1 个答案:

答案 0 :(得分:0)

通常的答案将是“历史原因”。通常,源代码曾经(并且可能仍然)使用具有不同C语言和/或限制和/或兼容性要求的多个编译器针对多个平台进行编译。

例如:

  • 与另一个定义具有不同名称的函数的库的兼容性
  • 与对标识符长度有严格限制的编译器/链接器平台的兼容性
  • 迁移/重构练习中的化石代码,其中所有功能都已重命名
  • 一个产品差异化练习,其中功能的子集是从具有不同功能名称的相同代码库(或来自此类练习的剩余部分)编译的。

C语言已有45年历史了:ISO C11并不总是存在,并且许多正在使用,维护和定期编译的代码可以追溯到C11之前的时代(或者实际上是C89之前的时代)。 / p>

在这种情况下我注意到GitHub历史记录中有一条评论说“将ED模块与EC模块集成”。可能这与这种类型的运动有关,例如允许以不同的名称在不同的编译单元中调用某些公共函数。