GCC: 禁止隐式的bool到int转换

11
有没有gcc标志可以禁止隐式的bool到int转换?
我想在这段代码中得到任何警告:
void function( int value, bool flag ) { }

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

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

1
在C语言中使用bool,需要添加头文件#include <stdbool.h> - pmg
隐式转换不是“强制转换”。根据定义,强制转换必须是显式的。另外,您是在询问C还是C ++?它们是不同的编程语言。 - The Paramagnetic Croissant
至于错误:您的“常见错误”很容易通过它还执行从intbool的“缩小”转换来检测。您可以对此发出警告。 - The Paramagnetic Croissant
删除了 C 标签,因为这个问题似乎与 C 无关。如果有误,请添加回来,但是请删除 C++ 标签。 - user743382
6个回答

6

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

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

5
回答你的问题:没有gcc标志可以在那种情况下发出警告。你的问题已经在gcc邮件列表上讨论过几次。例如,这里:
编译器不检查这个的主要原因在于否则每个像 if( intval ) 这样的语句也会引发警告。

总结:「显然,我们意见不一。由于我认为没有必要更改编译器,所以我不会亲自去做。如果你坚信这样的更改是必要的,请将更改后的补丁发送到gcc-patches@gcc.gnu.org。敬礼, 马丁」 - amordo

2

2
使用一个包装类:
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

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

把以下关于编程的内容从英语翻译成中文。只返回翻译后的文本: - Alex Celeste

0
使用问题 kernel.h 中的 min 宏 中的思路,您可以使用 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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接