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

What are these C directives doing and why was this library built this way?

我正在浏览 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

我了解基本的预处理指令。例如,我知道 ## 是连接两个标记。但是,我看不出这些指令如何能够 create/nullify(除其他外)对象 g1_t。这种设计形式对我来说很陌生。任何人都可以提供一些关于这些指令的作用以及为什么以这种方式构建软件(即优势)的见解吗?

照常回答 "historical reasons"。一般来说,源代码曾经(也许现在仍然)使用多个编译器为多个平台编译,这些编译器具有不同的 C and/or 限制 and/or 兼容性要求。

例如:

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

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

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