c - 有什么办法可以在 C 中制作 "protected"typedef 吗?

标签 c types typedef protected information-hiding

如果您想切入正题,请跳到最后两段。如果您对我的困境以及我为解决它所采取的步骤感兴趣,请继续直接阅读下文。

作为实习的一部分,我目前正在开发 C 库的一部分。所以很自然地,有些代码部分不应该被用户访问,而其他部分应该是。我基本上是在开发几个架构优化的随机数生成器 (RNG)(均匀、高斯和指数分布数)。后两个 RNG 依赖于位于不同内核(项目)中的统一生成器。因此,在用户想要使用多个 RNG 的情况下,我想确保我没有不必要地重复代码,因为我们受到内存的限制(在代码段)。

问题来了。库中所有其他内核的约定是我们有两个头文件和两个 C 文件(一个用于自然 C 实现和优化的 C 版本(可能使用一些内部函数和汇编和/或有一些限制使我们的体系结构更快更好。接下来是另一个 C 文件(一个测试台),我们的主要功能所在的位置,它测试两个实现并比较结果。话虽如此,我们不能真正为添加额外的头文件私有(private)或 protected 项目,我们也不能为所有这些生成器添加全局头文件。

为了解决这个限制,我在 C 文件中使用了 extern 函数和 extern const int,它们依赖于统一的 RNG 而不是 #define 位于每个 C 文件的顶部,以便使代码更易于移植并易于在一处进行修改。这在大多数情况下都有效。

然而,棘手的一点是我们在这些内核中使用了一个内部类型(它不应该被用户看到,也不应该放在头文件中)。同样,为了可移植性,我希望能够在一个地方而不是在多个内核的多个地方更改此 typedef 的定义,因为该库可能会在以后用于另一个平台和工作的算法 我使用 32 位类型是至关重要的。

所以基本上我想知道是否有任何方法可以让 typedef 在 C 中“ protected ”。也就是说,我需要它在所有需要它的 C 文件中可见,但不可见给用户。它可以在其中一个头文件中,但对于将在他/她的项目中包含该头文件的用户来说一定是不可见的,无论它是什么。

============================编辑==== ============================
我还应该注意,我使用的 typedef 是一个无符号整数。所以

typedef unsigned int myType

不涉及任何结构。

============================ super 编辑=== =======================
也禁止使用 stdint.h :(

最佳答案

我正在扩展 Jens Gustedt’s answer因为 OP 仍然有问题。

首先,不清楚为什么您有两个实现(“自然 C”和“优化 C”)的单独头文件。如果它们实现相同的 API,则一个 header 应为其中任何一个服务。

Jens Gustedt 的建议是在 header 中声明一个 struct foo,但仅在用于实现的 C 源文件中而不是在 header 中定义它。以这种方式声明的 struct 是不完整的类型,只能看到声明而看不到定义的源代码看不到类型中的内容。但是,它可以使用指向该类型的指针。

不完整的 struct 的声明可能像 struct foo 一样简单。您还可以定义一个类型,例如 typedef struct foo foo;typedef struct foo Mytype;,您可以定义一个类型,它是指向 的指针结构,例如typedef struct foo *FooPointer;。然而,这些仅仅是为了方便。它们不会改 rebase 本概念,即有一个 API 用户看不到但可以指向的 struct foo

在实现中,您将完全定义struct。如果你想在 struct 中使用 unsigned int,你可以使用:

struct foo
{
    unsigned int x;
};

通常,您定义struct foo 以包含您喜欢的任何数据。

由于 API 用户无法定义 struct foo,因此您必须根据需要提供创建和销毁此类对象的函数。因此,您可能会将函数声明为 extern struct foo *FooAlloc(some parameters);。该函数创建一个 struct foo 对象(可能通过调用 malloc 或相关函数),使用参数中的数据对其进行初始化,并返回指向该对象的指针(或 NULL如果创建或初始化失败)。您还可以使用 extern void FooFree(struct foo *p); 函数来释放 struct foo 对象。您可能还拥有重置、设置或更改 foo 对象状态的函数、复制 foo 对象的函数以及报告 foo 对象的函数。

您的实现还可以定义一些全局 struct foo 对象,这些对象对 API 用户可见(基本上仅通过地址)。作为一个好的设计,这应该只用于某些特殊目的,例如提供具有特殊含义的 struct foo 对象的实例,例如具有永久“初始状态”的常量对象复制。

你的两个实现,“自然 C”和“优化的 C”实现可能对 struct foo 有不同的定义,前提是它们没有在一个程序中一起使用。 (也就是说,每个整个程序都使用一种实现进行编译,而不是使用两种实现。如有必要,您可以使用 union 将两者合并到一个程序中,但最好避免这种情况。)

这不是单例方法。

关于c - 有什么办法可以在 C 中制作 "protected"typedef 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17604132/

相关文章:

c - 文件 'read' 怎么样?

types - 在类型别名上调用静态方法

c# - 在运行时转换为多个(未知类型)

c++ - 如何 typedef 模板类?

c - memfrob函数的设计与使用

c - 语句 `int val = (++i >++j) ?++i :++j;` 是否调用未定义的行为?

c++ - + 和++ 的运算符优先级

c - 返回值的类型检查

c - typedef 结构清晰度

c++ - linux-windows跨c++应用