2012-09-05 48 views
4

我有一些框架代碼,這是否:的iOS雙方法參數故障

#ifdef USE_DOUBLE 
typedef double real; 
#else 
typedef float real; 
#endif 

但是,當我嘗試使用此類型時USE_DOUBLE定義(那麼真實==雙),像這樣:

- (id) initSomeObject:(real)arg andSomeOtherStuff:(id)thing 
{ 
    self = [super init]; 
    if (self) 
    { 
     field = arg; 
    } 
} 

[someObject initSomeObject:2.0 andSomeOtherStuff:nil]; 

arg值被完全刪除,顯示爲5.3 ... e-315。 但是,如果我切換USE_DOUBLEoff2.0的值完美工作。這是最新的iOS 5+,在iPhone 4上使用Xcode 4.3.3和LLVM 3.1。iOS不能很好地處理雙打?我的USE_DOUBLE標誌是否應該一直未被解除?

+3

雙重類型絕對支持。可能並非所有文件都看到相同的類型。例如,一些文件看到真實的雙倍,但其他一些文件看到真正的浮動 –

+2

什麼類型有你的'領域?也許有從'real'到'field'的隱式轉換,如果'double'存在缺陷? –

回答

0

定義USE_DOUBLEreal類型是在我的應用程序使用的靜態庫中定義的。原來,USE_DOUBLE需要在框架並在客戶端應用程序typedef正常工作被設置爲相同的值。看來我的應用程序被認爲是一個單獨的編譯單元,這意味着因爲它沒有定義USE_DOUBLE,所以real是一個浮點數。這會導致運行時縮小我的值的精度並導致意外/未定義的行爲。將#define USE_DOUBLE添加到我的應用程序項目中似乎解決了此問題。

+0

如果該值也必須在我的客戶端應用程序中設置,則這似乎會破壞靜態庫中'#define'的用途。這讓我相信我濫用'#define'。什麼是更好的方式能夠獨立於客戶端應用程序以浮點或雙精度重新編譯我的靜態庫? – Grimless