2015-08-14 53 views
0

我使用typedef float engtypetypedef double engtypefloatdouble之間進行快速更改以進行一些測試。當我做這個例如C++避免使用typedef進行類型轉換警告

engtype rmwt = 20.75; 
engtype Rgas = 8314.28/rmwt; 

編譯器可能的數據丟失或截斷的抱怨轉換從doubleengtype。爲了讓這個警告消失,我做了這個

engtype rmwt = 20.75; 
engtype Rgas = static_cast<engtype>(8314.28)/rmwt; 

這似乎有點荒謬。我搜索了一種方法,使其默認爲engtype,但沒有找到任何東西。 typedef的這種用法是否正確?我應該如何處理警告?我知道我可以忽略它們,但應該有一個「正確」的方法來清除它們。

+0

您使用哪種編譯器? – cup

+0

想知道你沒有收到編譯錯誤? – user258367

+0

編譯器是MSVS 2013.代碼運行正常並不是錯誤。只是給了一堆警告。 – Matt

回答

1

您無法更改8314.28的含義:這是一個double期間。

什麼你可以要做的就是完成你的typedef帶有相關的用戶自定義的文字:

engtype operator ""_eng (long double d) { 
    // Add a cast here if the compiler still complains 
    return d; 
} 

獲得:

auto rmwt = 20.75_eng; 
auto Rgas = 8314.28_eng/rmwt; 
+0

我喜歡這個主意,但VS 2013不支持它。在C++ 11之前有沒有辦法做到這一點? – Matt

+0

@Matt不幸的不是。也許你可以通過內聯函數'inline engtype eng(long double d);'獲得一些不太難看的東西。 – Quentin

0

您對typedef的使用是正確的。要處理警告,您必須使用static_cast(NUMBER)。

1

你的常量是雙打,這就是爲什麼它轉換爲浮動時抱怨。如果你讓它們浮動:

engtype rmwt = 20.75F;

然後它將float轉換爲double或float轉換爲float,編譯器不會抱怨。

0

如此例如

auto pi = 3.14 ;  // pi type is double in this case 

要分配ü應使用f後綴

auto pi = 3.14f;   // pi type is deduced to float 

所以浮點值初始化,你必須使用一個浮點值,「F」後綴 當烏爾改變typdef你正在給float類型賦值double值。