[英]Why does gcc not warn when an enum or int value is passed on as a function's argument which is bool?
[英]Is GCC correct to warn of format string mismatch with a scoped enum?
在varargs上下文中使用作用域枚舉時,它被定義為作為其基礎類型傳遞,如“ 我可以將枚舉類值用作varargs函數的參數嗎? ”中回答的那樣,據我所知,這是唯一的情況有作用域的枚舉將像無范圍的枚舉一樣隱式轉換。
考慮以下程序:
enum Foo : char { F };
enum class Bar : char { B };
#include <cstdio>
int main()
{
return !std::printf("%c\n", Foo::F)
+ !std::printf("%c\n", Bar::B);
}
編譯器( g++
版本6.3.0)對Foo
的第一次打印感到滿意,但是在傳遞Bar
時抱怨:
0.cpp: In function ‘int main()’:
0.cpp:10:34: warning: format ‘%c’ expects argument of type ‘int’, but argument 2 has type ‘Bar’ [-Wformat=]
+ !printf("%c\n", Bar::B);
^
g++
4.8.2版本對此沒有抱怨,但是g++
6.3.0對此有所抱怨(這就是為什么它現在讓我擔心的原因)。 當存在實質性的不匹配時,例如使用%f
或%s
,或者如果我將Foo
更改為使用long
基礎類型,則這兩個版本都會抱怨第一次打印。 這就是為什么我啟用-Wformat
的原因。
我知道警告不是一個符合標准的問題,並且我知道如何更改代碼來解決這些問題(例如,使用“ 如何在C ++ 11中輸出枚舉類的值”的答案中的函數),但是我還認為,警告如果產生誤報,將無濟於事。 當枚舉的基礎類型與格式字符串中的相應轉換規范匹配時,將范圍限定的枚舉傳遞給格式化的I / O函數是否有任何實際危害?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.