2008-11-06 92 views
2

我正在研究一個代碼庫,我們有幾個可配置的類型。其中一種類型是64位整數。當我們編譯爲沒有原生64位整數類型的平臺,我們簡單表示使用類似的結構體64個整數結構之間的鑄造?

typedef struct { 
    unsigned int hi, lo; 
} int64; 

爲了使這種類型的有用的,所有常見的操作被定義爲函數,如

int64 int64_add(int64 x, int64 y); 

在平臺上,其中一個原生的64位整數類型,那麼,這些操作簡單的樣子

#define int64_add(x, y) ((x) + (y)) 

反正上的問題。我在執行關於時間的一些功能,我想使用64位整數來表示我的時間:

typedef int64 mytime; 

我也希望所有可供的Int64類型的一般性操作可用於我的時間類型以及:

#define mytime_add(x, y) (mytime) int64_add((int64) (x), (int64) (y)) 

這個問題是,類型mytime和int64之間的轉換不允許在C中(據我所知可以)。有沒有辦法做到這一點,而不必重新實現mytime類型的所有add,sub,mul,div等功能?

一個選項當然是永遠不會執行mytime typedef,並且只需要在任何需要表示時間的地方使用int64。這個問題是我不確定我是否總是想把時間表示爲64位整數。然後是可讀的代碼問題,以及... :-)

回答

3

你真的需要演員嗎? gcc正在編譯下面的例子,沒有任何抱怨:


typedef struct int64 int64; 

struct int64 
{ 
    unsigned int hi, lo; 
}; 

typedef int64 mytime; 

int64 
add_int64(int64 a, int64 b) 
{ 
    int64 c; 
    /* I know that is wrong */ 
    c.hi = a.hi + b.hi; 
    c.lo = a.lo + b.lo; 

    return c; 
} 

int 
main(void) 
{ 
    mytime a = {1, 2}; 
    mytime b = {3, 4}; 
    mytime c; 

    c = add_int64(a, b); 

    return 0; 
} 
1

你可以嘗試:

#define mytime int64 

代替的typedef。

看起來它會爲您提供透明的轉換和您正在尋找的可維護性。

1

看看stdint.h頭文件。它包含int64_t,uint64_t等'。這是標準和便攜的方式,你將避免需要實現數學功能:)。

+1

沒有幫助,因爲如果編譯器支持64位類型,int64_t將僅存在於此處。 – 2008-11-07 13:59:32

4

因爲你使用的是typedef,所以你根本不需要cast。 C中的Typedef不會創建一個不同的類型,只能是另一個類型的別名。編譯器不區分它們。只寫mytime_add功能:

#define mytime_add(x, y) int64_add((x), (y)) 

,或者如果你的C編譯器是不夠好做內聯:

mytime mytime_add(mytime x, mytime y) { return int64_add(x, y); } 
+0

爲什麼不只是`#define mytime_add int64_add`而不用擔心宏參數的評估,並且還能夠將mytime_add作爲函數指針使用呢? – 2009-12-13 07:46:24

0

對,所以我使用typedef和沒有鑄造。工作正常。看起來很奇怪,雖然明確的演員不能編譯,而隱含的演員卻不能編譯。如果隱式轉換真的不是一個強制轉換,因爲編譯器將這兩種類型看作是相同的類型,可以認爲在進行顯式強制轉換時,同樣的推理是可行的。

+0

`(int)someIntVar;`編譯? – 11684 2013-03-13 14:24:57