gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:00:53 26 4
gpt4 key购买 nike

我正在浏览 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。这种设计形式对我来说很陌生。任何人都可以提供一些关于这些指令的作用以及为什么以这种方式构建软件(即优势)的见解吗?

最佳答案

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

例如:

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

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

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

关于c - 这些 C 指令在做什么,为什么要以这种方式构建这个库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45016556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com