繁体   English   中英

在C中隐藏类型定义

[英]Hide type definition in C

我有一个.c文件(一个函数库),带有一个函数和一个这样的定义:

typedef long double big;
big foo(int x) { ... }

我想创建这个库的接口, .h 所以我做:

typedef long double big;
big foo(int);

并删除typedef long double big; .c文件。 但是通过这样做,我在接口中放弃了big的类型定义,因此它并不是真正的干净接口。 任何想法如何解决?

我知道我可以在.c文件中执行此操作:

struct foo {
  long double;
};

然后在.h文件中执行以下操作:

typedef struct foo big;
big foo(int);

但是为一个字段创建一个struct似乎很浪费,而且我应该使用. 每当我想阅读big

如果类型永远不会比long double复杂,那么就不值得再隐藏更多。 如果可能需要变得更复杂,则可以考虑使用不透明类型。 在公共头文件big.h ,使用:

#ifndef BIG_H_INCLUDED
#define BIG_H_INCLUDED
typedef struct big big_t;

extern big_t *foo(int);

...

#endif

所有函数都将采用并返回指向big_t类型的指针。 这就是使用不完整类型所做的所有工作。 请注意,您的客户无法为其分配任何big_t值; 他们不知道类型有多大。 这意味着您可能最终会遇到以下功能:

extern big_t *big_create(void);
extern void   big_destroy(big_t *value);

创建和销毁big_t值。 然后他们将能够使用以下方法进行算术运算:

extern big_errno_t big_add(const big_t *lhs, const big_t *rhs, big_t *result);

等等,但是因为它们只有不透明的,不完整的类型,所以它们不能可靠地在big_t结构内big_t 但是请注意,您只能在接口中使用指针。 传递或返回值需要完整的类型,如果类型完整,则用户可以调查其内部工作方式。

在实现标头bigimpl.h ,您将具有:

#ifndef BIGIMPL_H_INCLUDED
#define BIGIMPL_H_INCLUDED
#include "big.h"

struct big
{
    ...whatever the details actually are...
};

#endif

而且您的实现代码将仅包含bigimpl.h ,但其中包含big.h 这里的主要问题是确保您知道如何处理内存分配。

有时这种技术是值得的。 通常,这并不是真正必要的。 您需要自己进行评估。

并删除typedef long double big; 从.c文件。 但是通过这样做,我在接口中放弃了big的类型定义,因此它并不是真正的干净接口。

怎么会这样? 谁在乎您的代码用户是否可以看到typedef? 它怎么疼...什么? 他们需要一种使用typedef的方法,这就是完成方法。 对我来说,这听起来像是一个理论上的问题,没有明显的不良影响。 您担心的是错误的事情。

但是tit似乎只为一个字段创建结构,这很浪费,而且我应该使用。 每当我想阅读大的运算符时。

是的,这很愚蠢。 另外,现在您已经放弃了struct的定义! 不好了! 与公开typedef(或任何其他类型)有什么不同?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM