簡體   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