- 論壇徽章:
- 0
|
我一直都用C++編譯器的,現(xiàn)在開(kāi)始用純C寫點(diǎn)東西,遇到不少問(wèn)題,請(qǐng)教下大家,先謝謝。
我這現(xiàn)在有個(gè)宏
#define RX_GET_ELEM(ptr, elem_size, n) ((void*)((rx_byte*)ptr + ((n) * elem_size)))
我確實(shí)不太喜歡這種容易出錯(cuò)的東西用宏
我對(duì)static函數(shù)的理解就是在單獨(dú)的編譯單元內(nèi)生成一份copy,所以鏈接時(shí)候兩個(gè)同樣的編譯單元出現(xiàn)同樣的符號(hào)就沒(méi)問(wèn)題了,例如
a.c和b.c內(nèi)都定義了
static void test() { int x = 0; }
那么鏈接時(shí)候是不會(huì)出問(wèn)題的。
但是我現(xiàn)在的做法是再一個(gè)公用的頭文件內(nèi)(例如:rx_misc.h)聲明并定義
static void* RX_GET_ELEM(void *ptr, size_t elem_size, size_t idx)
{
return ((void*)((rx_byte*)ptr + ((idx) * elem_size)));
}
我之所以認(rèn)為它們可以取代inline的做法是因?yàn)橐话憔幾g器做函數(shù)展開(kāi)的前提是此函數(shù)的定義在編譯單元內(nèi)可見(jiàn),例如我這個(gè)在頭文件上定義的函數(shù)就是這樣的,vc8也確實(shí)可以做優(yōu)化。
請(qǐng)問(wèn)這樣做是不是可行的?
btw:因?yàn)槲也挥胕nline的目的也是希望它們?cè)诰幾g器間移植
即使編譯器不能做優(yōu)化,至少它應(yīng)該保證我這么定義永遠(yuǎn)是可以編譯通過(guò)的
[ 本帖最后由 Solidus 于 2008-1-26 18:44 編輯 ] |
|