örtük "bool -> int" dönüşümünü yasaklayan gcc bayrağı var mı?GCC: örtülü bool-> int dönüşümü
template <typename T> void function(int, T) = delete;
örtük "bool -> int" dönüşümünü yasaklayan gcc bayrağı var mı?GCC: örtülü bool-> int dönüşümü
template <typename T> void function(int, T) = delete;
, C++ 11:
Bu kod ile herhangi bir uyarı almak istiyorum :
class Boolean
{
bool flag;
public:
explicit Boolean(bool something){}
bool getValue() const {return flag;}
void setValue(bool a) {flag = a;}
};
void function(int value,Boolean flag) { }
int main()
{
int a = 123;
Boolean flag(true);
function(flag, a); // fails! Boolean isn't a int value :)
}
bir sarıcı sınıfını kullanın: diğer olası aşırı yüklenmeleri silebilir Çözüm olarak
void function(int value, bool flag) { }
int main()
{
int a = 123;
bool flag = true;
//oops, a common mistake
function(flag, a);
}
Sorunuzu yanıtlamak için: hayır, bu durumda uyarı vermek için gcc bayrağı bulunmuyor. Sorununuz gcc posta listesinde birkaç kez tartışıldı. Örneğin here:
Bunun derleyici tarafından kontrol edilmemesinin başlıca nedeni, aksi halde if(intval)
gibi her bir bildirimin de bir uyarı oluşturacağı gerçeğinde yatmaktadır.
#include <stdbool.h>
#include <stdio.h>
bool x = true;
int y = _Generic(1, bool:2);
int main(void) {
printf("%d\n", y);
}
Bu: Söz konusu fikri kullanarak
min macro in kernel.h gcc en typeof
#include <stdbool.h>
#define function(x, y) do { \
__typeof(x) tmpone = (x); \
int tmptwo = 0; \
(void) (&tmpone == &tmptwo); \
fx((x), (y)); \
} while (0)
void fx(int value, bool flag) {
(void)value;
(void)flag;
}
int main(void) {
int a = 123;
bool flag = true;
function(a, flag);
function(flag, a); // oops, a common mistake
}
C, yalnızca bir tür destekler jenerik-seçiminde bir değer sarabilirsiniz kullanabilirsiniz hataları (GCC 4.9), ancak true
veya x
ile değiştirirseniz, şikayete gerek kalmaz. Yani örneğin
:
#include <stdbool.h>
void function(int value, bool flag) { }
#define function(V, F) function(V, _Generic(F, bool:F))
int main() {
int a = 123;
bool flag = true;
function(flag, a); // error: '_Generic' selector of type 'int' is not compatible with any association
}
(bu soru cevaplandığında C olarak etiketlendi, OP açıklanmadı) – Leushenko
clang-tidy daha iyi sizi uyarır veya olacak, bu sizin için bir hata yapmak.
Bunun için test readability-implicit-bool-conversion. Linter'in önceki versiyonlarında test readability-implicit-bool-cast
olarak adlandırılmıştır.
C içinde 'bool' kullanmak için olan a1> olan < –
pmg
a1> örtülü bir dönüşüm" döküm "değil. Bir döküm, tanım olarak, açık bir dönüşüm olmalıdır. Ayrıca C veya C++ hakkında soru soruyor musunuz? Onlar farklı diller. –
Hatasına göre: "ortak hata", "int" ile "bool" arasında bir ** daraltma ** dönüşümü gerçekleştirmesiyle kolayca algılanır. Bunun yerine bununla ilgili uyarıda bulunabilirsiniz. –