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]
錯過了我們在代碼庫中使用的-Werror標誌。但我仍然好奇,鏗鏘的問題是 – meddle0106
,但它仍然是一個uint8_t不是嗎?而正確的格式說明符是'PRIu8'不是嗎?那麼最新錯誤? – meddle0106
不,它不是'uint8_t',它是'enum class Foo'。就類型系統而言,這些是不同的事情(這是一件好事)。 –