【发布时间】:2013-07-10 08:38:01
【问题描述】:
如果你想切入正题,请跳到最后两段。如果您对我的困境以及我为解决它所采取的步骤感兴趣,请继续阅读下面的内容。
作为实习的一部分,我目前正在开发 C 库的一部分。所以很自然,有些代码部分不应该被用户访问,而其他部分应该是。我基本上正在开发几个架构优化的随机数生成器 (RNG)(均匀、高斯和指数分布数)。后两个 RNG 依赖于 uniform generator ,它位于不同的内核(项目)中。因此,如果用户想要使用多个 RNG,我想确保我不会不必要地复制代码,因为我们受到内存的限制(在不同的地址多次定义相同的函数是没有意义的代码段)。
现在问题出现了。库中所有其他内核的约定是我们有两个头文件和两个 C 文件(每个用于自然 C 实现和优化的 C 版本(可能使用一些内在函数和汇编和/或有一些限制)使其更快更好地适应我们的架构)。紧随其后的是另一个 C 文件(测试平台),我们的 main 函数位于该文件中,它测试两个实现并比较结果。话虽如此,我们不能真正添加额外的头文件私有或受保护的项目,我们也不能为所有这些生成器添加全局头文件。
为了克服这个限制,我在 C 文件中使用了 extern 函数和 extern const int,它们依赖于统一的 RNG 而不是 #define 位于每个 C 文件的顶部,以使代码更具可移植性并易于在一个位置进行修改。这在大多数情况下都有效。
然而,棘手的一点是我们在这些内核中使用了内部类型(用户不应该看到它,也不应该放在头文件中)。同样,为了可移植性,我希望能够在一个地方而不是多个内核中的多个地方更改此 typedef 的定义,因为该库以后可能会用于另一个平台并用于使用 32 位类型的算法至关重要。
所以基本上我想知道是否有任何方法可以使 typedef 在 C 中“受保护”。也就是说,我需要它在所有需要它的 C 文件中可见,但不可见给用户。它可以在其中一个头文件中,但对于将在他/她的项目中包含该头文件的用户,无论它可能是什么,都不能看到它。
=============================编辑==== ==============================
我还应该注意,我使用的 typedef 是一个无符号整数。所以
typedef unsigned int myType
不涉及结构。
=============================超级编辑=== ========================
也禁止使用 stdint.h :(
【问题讨论】:
-
typedef struct foo { int bar; } foo;in<inernal.h>,然后只向用户公开<non-internal.h>。 -
但同样,我不能真正向内核添加另一个头文件(由于历史原因与库的其余部分)。否则这整个崩溃会更容易。对我来说很不幸(对他来说很幸运),主管正在欧洲度假,所以我真的不能问他是否可以更改文件结构。内部类型本身就引发了一些关于历史实践的争论。最终,决定只在内部使用它,现在我坐在这里:像地毯上的虫子一样自鸣得意;没有骰子!
标签: c types typedef protected information-hiding