2016-10-19 47 views
1

請考慮以下最低例如:printf的枚舉類與inttypes並不鏗鏘工作

#include <cstdint> 
#include <cstdio> 
#include <cinttypes> 
#include <type_traits> 

enum class Foo : uint8_t 
{ 
    John, 
    Jane 
}; 

int main() 
{ 
    // does not compile with clang but works fine with gcc 
    printf("here is my %" PRIu8 "\n", Foo::John); 

    //with cast works fine also with clang 
    using T = typename std::underlying_type<Foo>::type; 
    printf("here is my %" PRIu8 "\n", T(Foo::John)); 

    //with cast works fine also with clang 
    printf("here is my %" PRIu8 "\n", uint8_t(Foo::John)); 

    return 0; 
} 

也看到Live Example

這個例子很好編譯用gcc,例如gcc 4.9.4。 這個例子沒有用clang編譯,例如鐺3.9.0

爲什麼不能給printf是由STD-inttypes只要使用相應的printf說明符派生類的枚舉,在這種情況下PRIu8在鐺?這是一個鏗鏘編譯器錯誤?或者我錯過了C++標準中的細節?

編譯錯誤是

warning: format specifies type 'unsigned int' but the argument has 
underlying type 'uint8_t' (aka 'unsigned char') [-Wformat] 
+0

錯過了我們在代碼庫中使用的-Werror標誌。但我仍然好奇,鏗鏘的問題是 – meddle0106

+0

,但它仍然是一個uint8_t不是嗎?而正確的格式說明符是'PRIu8'不是嗎?那麼最新錯誤? – meddle0106

+0

不,它不是'uint8_t',它是'enum class Foo'。就類型系統而言,這些是不同的事情(這是一件好事)。 –

回答

2

enum class Foo一個uint8_t它是正好使用uint8_t作爲其底層表示的枚舉。如果您希望將其轉換爲uint8_t,請使用static_cast

該系統實際上是試圖幫助你在這裏 - 類型不同(即使可轉換)。