簡體   English   中英

它是C中接口定義的常用方法嗎?

[英]Is it a common way of interface definition in C

我找到一個foo.h文件:

typedef STRUCT_s STRUCT;

STRUCT *foo();

foo.c文件:

#include "i_foo.h"

struct STRUCT_s{
 //...
};

#define STRUCT struct STRUCT_s
STRUCT *foo()
{
    STRUCT *s;
    //...
    return s;
}

這是隱藏C中結構定義的常用方法嗎? 如果是,我想知道,如果結構未在標題中聲明,客戶端應該如何使用它?

用戶通過這種方式無法實例化結構,只能將此類型的對象視為指針。 因此,所有構造函數和方法,getter,setter等對用戶來說都是模糊的,應該在庫源中定義。

一個明顯的額外后果是,如果您更改結構,用戶不必更改代碼中的所有用途來初始化新字段或注釋掉已解散的字段。 既然沒有,就沒有了。 結構的內部私有結構是完全隱藏的。

這是在C中隱藏結構定義的常用方法。客戶端不應該直接使用結構。 他必須只使用接口中提出的函數來與數據交互:實例化,設置或獲取值,在其上啟動操作,....

通過這種方式,實現對客戶端完全隱藏。 因此客戶端不受實現變化的約束。 根據界面沒有變化,圖書館可以根據需要進行演變而不會打擾客戶端。

是的,這是聲明抽象數據類型(ATD)的常用方法。 ADT僅通過其接口使用,該接口由頭文件中聲明的函數表示。 客戶端不直接訪問這些字段。 為所有導出的標識符添加前綴也是一個好主意。 這可以避免名稱沖突,並清楚地表明導入的標識符的來源。

例:

Stacks.h

typedef struct Stacks_StackDesc *Stacks_Stack;

Stack Stacks_New(void);

void Stacks_Push(int x, Stacks_Stack s);

void Stacks_Pop(Stacks_Stack s, int *top);

Stacks.c

#include "Stacks.h"

struct Stacks_StackDesc {
   ...
};

Stack Stacks_New(void)
{
   ...
}

void Stacks_Push(int x, Stacks_Stack s)
{
   ...
}

void Stacks_Pop(Stacks_Stack s, int *top)
{
   ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM