GCC:禁止隐式bool-> int转换

时间:2015-02-25 10:18:00

标签: c++ gcc

是否有任何gcc标志禁止隐含" bool - > INT"转化

我想通过此代码获得任何警告:

void function( int value, bool flag ) { }

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

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

6 个答案:

答案 0 :(得分:5)

作为一种解决方法,在C ++ 11中,您可以删除其他可能的重载:

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

答案 1 :(得分:2)

回答你的问题:不,在这种情况下没有gcc标志发出警告。您在gcc邮件列表中多次讨论过您的问题。例如here

编译器未检查此问题的主要原因在于,if( intval )之类的每个语句都会引发警告。

答案 2 :(得分:2)

在C中,您可以将值包装在仅支持一种类型的泛型选择中:

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

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

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

此错误输出(GCC 4.9),但如果您将1替换为truex,则无需投诉即可进行编译。

所以对你的例子来说:

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

答案 3 :(得分:1)

使用包装类:

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

答案 4 :(得分:0)

使用问题min macro in kernel.h中的想法,您可以使用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
}

答案 5 :(得分:0)

clang-tidy会警告你,或者甚至更好,让你犯这个错误。

对此的测试是readability-implicit-bool-conversion。在早期版本的linter中,测试名为readability-implicit-bool-cast