簡體   English   中英

GCC是否正確,以警告格式字符串與作用域枚舉不匹配?

[英]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函數是否有任何實際危害?

從此范圍枚舉參考

從范圍枚舉器的值到整數類型沒有隱式轉換,...

[強調我的]

這意味着無論基本類型如何,范圍枚舉都不會隱式轉換為int (或任何其他整數類型)。 您必須顯式地進行轉換,例如static_cast (續前一引文):

...盡管static_cast可用於獲取枚舉數的數值。


另外,從這個可變參量參考中

boolcharshort和無作用域枚舉將轉換為int或更寬的整數類型,如整數提升

[再次強調我的]


並回答您的問題:海灣合作委員會是否正確警告您:是的,這是正確的。 你在做什么是不正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM