Tôi đã mã sau:Tại sao gcc không cảnh báo khi một giá trị enum hoặc int được truyền vào như đối số của hàm là bool?
typedef enum
{
FOO,
BAR,
BAZ
} foo_t;
static void afunc(bool is_it_on)
{
/* do the job */
}
int main(void)
{
afunc(BAZ);
return 0;
}
Biên dịch mã này không tạo ra bất kỳ thông điệp cảnh báo, ngay cả với -Wall -Wextra
tùy chọn cho trình biên dịch. Tôi thậm chí đã thử với tùy chọn -Wconversion
, không có hiệu lực vì bool
và enum
có vẻ có cùng kích thước với g ++. (kích thước của enum
loại không được xác định trong đặc điểm kỹ thuật theo như tôi biết)
Tôi đã chải qua sổ tay gcc và không tìm thấy gì về nó.
Câu hỏi:
- Có cách nào để buộc các trình biên dịch để tạo ra một cảnh báo trong trường hợp như thế này?
- Hoặc liệu việc truyền ngầm này có hợp pháp theo đặc tả C++ không?
biên dịch mà tôi đang sử dụng: gcc 4.1.2
ngồi biên tập
Kết luận:
Các giải pháp khả thi duy nhất này dường như định nghĩa một kiểu mới để biểu diễn 0 hoặc 1 và sử dụng nó thay vì bool
.
Mã này sẽ như thế nào sau, và g ++ phàn nàn về loại chuyển đổi:
typedef enum
{
FOO1,
FOO2
} foo_t;
typedef enum
{
MY_FALSE,
MY_TRUE
} my_bool_t;
void foo(my_bool_t a)
{
}
int main(void)
{
/*
* gcc generates an error.
* error: cannot convert ‘foo_t’ to ‘my_bool_t’
* for argument ‘1’ to ‘void foo(my_bool_t)’
*/
foo(FOO1);
return 0;
}
Bởi vì C++' loại hệ thống chỉ tốt cho các loại do người dùng định nghĩa, cho các kiểu dựng sẵn mà nó luôn luôn hút. Hậu quả của di sản C của nó. –
Có vẻ như vậy.Tôi đã quyết định gõ một loại mới dành riêng để đại diện cho chỉ 0 hoặc 1, và sử dụng nó thay vì bool mà dường như được dự định để diễn tả _true_ hoặc _false_. – orchistro