2015-02-25 29 views
6

ö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; 
+1

C içinde 'bool' kullanmak için olan olan < – pmg

+0

ö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. –

+0

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. –

cevap

3

, 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 :) 
} 
1

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); 
} 
2

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

0

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 
} 
2

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 
} 
+0

(bu soru cevaplandığında C olarak etiketlendi, OP açıklanmadı) – Leushenko