Почему использование stdbool.h вызывает предупреждение в сочетании с -Wtraditional-conversion

Вот пример:

#include <stdbool.h>

void foo(bool b){};
void bar(bool b) {foo(b);}

int main() {
    bar(false);
}

Я компилирую с:

gcc -Wtraditional-conversion test.c

Я получаю эти предупреждения:

test.c: In function 'bar':
test.c:4: warning: passing argument 1 of 'foo' with different width due to prototype
test.c: In function 'main':
test.c:7: warning: passing argument 1 of 'bar' with different width due to prototype

Почему появляются эти предупреждения? Насколько я вижу, все аргументы одного типа, поэтому они должны быть одинаковой ширины. Что делает -Wtraditional-conversion, чтобы вызвать эти предупреждения в этом очень простом фрагменте кода?

Я начал получать эти ошибки, когда переключился с использования собственного определения типа bool на определение stdbool.h.

Моя первоначальная защита была:

typedef enum {false, true} bool;

person SimonAlfie    schedule 14.05.2012    source источник
comment
-Wtraditional-conversion означает Предупреждать, если прототип вызывает преобразование типа, отличное от того, что произошло бы с тем же аргументом в отсутствии прототипа. Кажется, вы используете C99, так зачем вам предупреждение?   -  person cnicutar    schedule 14.05.2012
comment
какая у вас версия gcc?   -  person Jens Gustedt    schedule 14.05.2012
comment
@JensGustedt gcc (Gentoo 4.4.3-r2 p1.2) 4.4.3   -  person SimonAlfie    schedule 14.05.2012
comment
@cnicutar Мне, наверное, не нужно предупреждение. Я не указывал флаги компилятора, это был какой-то другой. Вы можете ответить на вопрос, указав, что это, вероятно, не нужно.   -  person SimonAlfie    schedule 14.05.2012


Ответы (2)


Это был случай непонимания флагов предупреждения компилятора.

Используйте -Wconversion, а не -Wtraditional-conversion, чтобы получать предупреждения о неявном преобразовании. -Wtraditional-conversion для предупреждения о конверсиях при отсутствии прототипа.

Был пойман, потому что typdef enum создает целочисленный тип bool по умолчанию (обычно 32-битный), где as stdbool.h определяет bool как 8-битный, который совместим с bool C++.

person SimonAlfie    schedule 24.05.2012

Предупреждение о вызове bar верно, поскольку вы просите компилятор быть подвесным. false расширяется до константы int 0, поэтому это не bool (или _Bool).

Первое предупреждение - ошибка.

person Jens Gustedt    schedule 14.05.2012