C C 關於版本相容的方法 txt

2021-04-01 06:02:48 字數 1706 閱讀 8259

引言

程式設計多了,常常有些感觸.筆者發現在windows下很多結構都有乙個dwsize來表示這個結構多大,實際上這個成員是用來進行版本相容的.

最典型的乙個結構就是openfilename.這個結構用在了開啟檔案對話方塊.裡面的第乙個成員lstructsize就是用來存放結構的大小.使用在不同的環璄下

_win32_winnt > 0x0500 時和不定義這個巨集sizeof(openfilename)會不一樣的那麼lstructsize就會不一樣,這樣windows內部根據這個成員來得知程式執行的版本.

所顯示出的對話方塊就會不相同.這些都是大家共知的啦,筆者談了這些只是想引入乙個話題:我們如何來進行**的相容性.

正題我們先來看如下的乙個例子.

a.htypedef struct tagoption

option;

比如這是我定義的乙個結構可以進行一些功能的設定.

通過乙個結構的指標傳給我寫的乙個引出函式 hresult setoption(option *);

我在**裡判斷結構大小如果大小==sizeof(option)則進行操作,否則返回乙個錯誤**.

在**用了一些時間後我們需要對這個結構進行擴充,但要求對以前的這個版本相容.由於這個標頭檔案是給了別的開發者用的.相容性要考慮到那些開發者生成的可執行**是可以在新的平台上執行的.

這時我的dwsize就發揮了強大的作用,我只需要判斷一下dwsize是不是舊版本的大小,如果是則呼叫原來的那份**就可以了.

我的標頭檔案馬上變成了

typedef struct tagoption

option;

把舊的setoption改為setoption_v1()

新開了乙個函式setoption呼叫方式相同

hresut setoptiton(option * opt)

難道我們一定要在**中留下magi**umber嗎?

所以再改

#define size_option_v1 12

hresut setoptiton(option * opt)

option_core;

typedef option_core option_v1;

typedef option_core tagoption_v1;

const size_option_v1  = sizeof(option_v1);

#define option option_v1

如果需要公升級則新加如下**

struct tagoptionv2:public option_core

;typedef tagoptionv2 optionv2;

const size_option_v2 = sizeof(optionv2)

#undef  option

#define option tagoptionv2

#endif

現在我的**就變成了

hresut setoptiton(option * opt)

{if(opt->dwsize == size_option_v1 )

return setoption_v1(opt)

if(opt->dwsize == size_option_v2)  

.....

如果還需要公升級只需要按以上的**再新加乙個結構.

並且使用者永遠只需要使用option結構,並且sizeof(option)總等於他拿到的標頭檔案的版本中結構的大小.

關於MATLAB讀取txt檔案的方法

ilovematlab論壇最常見的問題top200 一 如何讀取乙個文件下,多個txt檔案?一般讀取的檔案,命名都具有一定的規律,除去相同部分,剩下的變化按照時間 序號 某一特定的標誌符等進行排列。下面我們舉個例子來操作。假如資料夾裡存在以下檔案 cs20170701 cs20170702 cs20...

關於fbx sdk版本向下相容問題

如fbx sdk 2016 2017 2018是這樣 the fbx sdk can import fbx files compatible with fbx file format versions 7.5,7.4,7.3,7.2,7.1,7.0,6.1,and 6.0.export fbx fi...

Ruby watir安裝及版本相容解決方法

1.安裝ruby 4.檢測 開啟scite,輸入 require watir ie watir ie.new ie.goto 儲存為a.rd檔案,f5執行,輸出 ruby a.rb exit code 0 到此安裝成功。中文問題 在用watir測試中文的時候,出現亂碼,網上查了下,對於watir1....