用C語言聯合體和列舉描述資料庫

2021-05-22 19:51:53 字數 1200 閱讀 3201

資料庫儲存了幾乎所有的業務資料,而這些資料畢竟不是靜態的,那麼就必然需要我們來寫程式完成資料的加工和整合,資料庫僅僅儲存我們加工整合後的結果,因此必然的,我們需要把資料庫中的資料讀到程式中,然後加工後再存入資料庫,同樣必然的,我們需要在程式中維持資料庫表的結構,那麼很顯然,我們需要在程式中定義很多結構體或者聯合體陣列來儲存資料庫查詢的結果,每個結構體代表了乙個紀錄,很多紀錄就用結構體陣列來表示,如此一來,程式就會顯得很臃腫,比如會出現下列的結構體:

struct girl

結構體的大小完全取決於資料庫表的列。這樣雖然可行但不甚合理,如果我們換一種思路或許能讓事情更簡單,讀了openssl的d2i和i2d的**,發現人家就沒有採用這樣臃腫的方式設計,雖然openssl沒有涉及資料庫但是畢竟涉及到了格式化的檔案,比如pem/der檔案,我們當前討論的意義上,這些格式化檔案和資料庫是一致的,openssl的方式十分值得我們來思考。

我們可以不考慮資料庫表的具體性質,僅僅將表的一列作為乙個「名稱-值」對,這樣每一條紀錄就可以被看作這樣的「對」的陣列,陣列的大小就是列的數量,如上例的一條紀錄,我們可以以下這樣定義,,,,,...},為了統一化,我們可以將諸如的項設計成乙個結構體,就是「名稱-值」的結構體:

struct abc

我們看看這樣是否合理,又沒有改進的空間,...很合理,但是雖然從資料庫中讀出的結果都是字串char*型別,但我們的程式需要將之轉化為其合理的資料型別才能處理,也就是說value最終並不全是字串型別,可能是任意型別,name顯然就是列名了。既然value可以是任意型別,我們便需要將之定義成聯合體:

struct abc value;

}接下來我們看一下還有沒有改進的空間,看看name欄位,它僅僅表示列名,它真的必不可少嗎?不!其實它僅僅起到乙個索引的作用,幫助程式找到特定的列,既然我們準備將結構體abc按照紀錄列設計成陣列,那麼陣列的下標就能完成此任,再設計乙個name欄位就是冗餘了,所以我們決定砍掉它:

struct abc value;

}那麼陣列下標如何索引資料庫紀錄列,畢竟它僅僅是一些毫無意義的數字,為了使程式有更強的可讀性和可維護性,我們需要賦予無意義的數字以意義,於是想到了列舉,於是定義下列列舉:

enum

於是我們只需要為每一條資料庫紀錄分配total個struct abc即可,然後直接用列舉型別來索引陣列特定的元素。最終列舉和聯合幫了大忙,列舉賦予了數字以意義,而聯合則使得資料定義可以統一,今後寫程式時可以借鑑一下這種方式,同時也感慨一下c語言真的很強大。

C語言系列(21) 聯合體 列舉

一 什麼是聯合體 共用體 聯合體是一種特殊的資料型別,允許您在相同的記憶體位置儲存不同的資料型別。您可以定義乙個帶有多成員的共用體,但是任何時候只能有乙個成員帶有值。共用體提供了一種使用相同的記憶體位置的有效方式。二 聯合體定義 union 變數名 union data 聯合體變數,變數名為data...

C語言 結構體 聯合體 列舉 typedef

2 聯合體 共用體 3.列舉型別 4 typedef define crt secure no warnings include include include include include struct 結構體名 struct student stu intmain0201 struct stu...

C語言結構體 列舉 巨集 聯合體

列舉常量與巨集的區別 聯合體和結構體區別 c和c 結構體區別 這篇文章很詳細,值得一看c語言結構體型別的定義和使用 關於結構體對齊問題請閱讀 結構體對齊規則及舉例 系統指定型別的大小與系統有關,這裡取 資料型別 位元組char 1float 4double 8long double 16short ...