2015-02-25 16 views
6

Czy jest jakaś flaga gcc, która zabrania niejawnej konwersji "bool -> int"?GCC: Zabroń niejawnej konwersji bool-> int

chcę dostać żadnego ostrzeżenia z tym kodem:

void function(int value, bool flag) { } 

int main() 
{ 
    int a = 123; 
    bool flag = true; 

    //oops, a common mistake 
    function(flag, a); 
} 
+1

Aby użyć 'bool' w C, musisz' #include ' – pmg

+0

Niejawna konwersja nie jest" obsadą ". Obsada z definicji musi być wyraźnym nawróceniem. Czy też pytasz o C lub C++? Są różnymi językami. –

+0

Co do błędu: "często popełniany błąd" można łatwo wykryć przez fakt, że wykonuje on także ** zawężenie ** konwersji z 'int' na' bool'. Możesz zamiast tego ostrzec. –

Odpowiedz

3

jako obejście, w C++ 11, można usunąć inne możliwe przeciążenia:

template <typename T> void function(int, T) = delete; 
1

Użyj klasy otoki :

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

Aby odpowiedzieć na pytanie: nie, w tym przypadku nie ma flagi gcc, która mogłaby wysłać ostrzeżenie. Twój problem został omówiony kilka razy na liście mailingowej gcc. Na przykład: here:

Głównym powodem, dla którego nie jest sprawdzany przez kompilator, jest to, że w przeciwnym wypadku każde z komunikatów, takich jak if(intval), również generuje ostrzeżenie.

0

Używając pojęcia w pytaniu min macro in kernel.h można użyć GCC 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

W C, można owinąć wartość w ogólnej selekcji, który obsługuje tylko jeden typ:

#include <stdbool.h> 
#include <stdio.h> 

bool x = true; 
int y = _Generic(1, bool:2); 

int main(void) { 
    printf("%d\n", y); 
} 

ten błędy (GCC 4.9), ale skompiluje się bez reklamacji, jeśli zastąpisz 1 z true lub x.

Tak dla przykładu:

#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

(to pytanie zostało oznaczone jako C w chwili odpowiedzi, OP nie wyjaśnił) – Leushenko

Powiązane problemy