你已經張貼什麼是「手動標記」是無效的C語法,我想你的意思是它是:
typedef enum {INT,STRING} u_types;
typedef struct {
u_types tag;
union u{
int i;
char s[1];
} d;
}tagged_union;
請注意,正式在C的struct/union 標籤的定義是STRUC/union關鍵字之後的名稱。在你的第二個例子,u
是聯合標記。這是我很困惑。
你描述爲「標籤聯合」被稱爲一個變種在計算機科學:可容納多種類型的變量。變體在編程時通常會被忽視,特別是在C中。 MISRA-C:2004,規則18.3和18.4禁止使用。
語言與變種的支持,如VB(也可能哈斯克爾?)通常存在,那麼爲:這個變量可以容納任何東西,但你要小心使用它,因爲它是非常低效的。
在C中,變體是不僅效率低,它們是安全隱患。 MISRA-c在規則18.3中認識到這一點:
例如:當一個程序實際上正在存儲另一種類型的值(例如由於中斷)時,它可能試圖從該位置訪問一種類型的數據。這兩種類型的數據在存儲中可能會有不同的排列方式,並會侵犯其他數據。因此,每次使用切換時可能無法正確初始化數據。這種做法在併發系統中特別危險。
所以問題應該是,是否有標籤聯合(變體)的任何用途?不,那裏沒有。我曾經寫過的任何C程序中都沒有使用過單一的程序,但沒有用處。由於C具有空指針,還有在C更好和更安全的方式來創建通用的數據類型:
void ADT_add_generic_type (void* data, some_enum_t type, size_t size);
看看C標準是如何實現的功能的qsort()和bsearch()的一些通用C編程(:1999 7.20.5.1 ISO 9899):很好的例子
void *bsearch (const void *key,
const void *base,
size_t nmemb,
size_t size,
int (*compar)(const void *, const void *));
說明bsearch函數搜索nmemb個目的, 初始元素,其中通過鹼指向的陣列,用於元素 與鍵指向的對象匹配。的 由size指定所述陣列的每個元件的尺寸。
爲 「無標記」 工會的用途有幾個,但是。數據協議,打包,硬件寄存器訪問等等。請參閱Dmitri的答案。
我不確定我是否理解這個問題。使用「untagged」/「untyped」,你的意思是沒有聯合標籤的union:union {int x; };'或*不完整類型*,例如'union something * x;'其中「something」還沒有被聲明?前者將是「未標記的」,它在C語言中有正式的含義。後者可能是「無類型的」,但據我所知,正式地說C中沒有任何東西被稱爲「無類型」。 – Lundin
我的意思是一個c類似的聯合(無類型是一個錯誤,我的意思是未標記的)沒有關聯的標籤(通常是一個在c結構中的枚舉)。而不是像Haskell中的union ADT這樣的東西在枚舉結構中枚舉枚舉 –
?這與ADT有什麼關係?現在我更加明白了。你可以用代碼示例更新你的問題嗎? – Lundin