2015-02-25 10 views
6

C'è qualche flag gcc per proibire la conversione "bool -> int" implicita?GCC: Vieta la conversione implicita bool-> int

voglio ottenere alcun preavviso con questo codice:

void function(int value, bool flag) { } 

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

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

Per utilizzare 'bool' in C è necessario' #include ' – pmg

+0

Una conversione implicita non è un" cast ". Un cast, per definizione, deve essere una conversione esplicita. Inoltre, stai chiedendo di C o C++? Sono lingue diverse. –

+0

Per quanto riguarda l'errore: il tuo "errore comune" è facilmente rilevato dal fatto che esegue anche una conversione ** restringente ** da 'int' a' bool'. Puoi avvisare su questo invece. –

risposta

3

Per aggirare il problema, in C++ 11, è possibile eliminare gli altri sovraccarichi possibili:

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

Utilizzare un classe wrapper :

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

Per rispondere alla tua domanda: no, non c'è nessun flag gcc per emettere un avviso in questo caso. Il tuo problema è stato discusso più volte sulla mailing list gcc. Ad esempio here:

Il motivo principale per cui questo non viene controllato dal compilatore consiste nel fatto che in caso contrario ogni istruzione come if(intval) solleva anche un avviso.

0

Utilizzando l'idea in questione min macro in kernel.h è possibile utilizzare di 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

In C gcc, si può avvolgere un valore in un generico-selezione che supporta un solo tipo:

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

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

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

Questo errori fuori (GCC 4.9), ma verrà compilato senza reclamo se si sostituisce il 1 con true o x.

Così, per il tuo esempio:

#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

(questa domanda è stata contrassegnata con C al momento della risposta, OP non è stata chiarita) – Leushenko

Problemi correlati