是否有任何gcc标志禁止隐含" bool - > INT"转化
我想通过此代码获得任何警告:
void function( int value, bool flag ) { }
int main()
{
int a = 123;
bool flag = true;
//oops, a common mistake
function( flag, a );
}
答案 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
替换为true
或x
,则无需投诉即可进行编译。
所以对你的例子来说:
#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
。