我导航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
。这种设计形式对我来说很陌生。任何人都可以提供一些见解,了解这些指令的作用以及为什么软件以这种方式构建(即优势)?
答案 0 :(得分:0)
通常的答案将是“历史原因”。通常,源代码曾经(并且可能仍然)使用具有不同C语言和/或限制和/或兼容性要求的多个编译器针对多个平台进行编译。
例如:
C语言已有45年历史了:ISO C11并不总是存在,并且许多正在使用,维护和定期编译的代码可以追溯到C11之前的时代(或者实际上是C89之前的时代)。 / p>
在这种情况下我注意到GitHub历史记录中有一条评论说“将ED模块与EC模块集成”。可能这与这种类型的运动有关,例如允许以不同的名称在不同的编译单元中调用某些公共函数。