Tôi vừa gặp lỗi khó chịu trong C++. Vì vậy, tôi đã có danh sách các thanh ghi và các giá trị, được bọc trong một cấu trúc và sau đó các cấu trúc đó được khởi tạo trong một mảng. Nhưng sau đó tôi vô tình nhập ()
thay vì {}
. Dưới đây là một số mã kiểm tra:Ý nghĩa của dấu ngoặc đơn trong C++ và C
#include <stdio.h>
struct reg_val {
unsigned reg;
unsigned val;
};
struct reg_val faulty_array[] = {
{0x5001, 0xff},
{0x5580, 0x01},
(0x5580, 0x02), //<- THIS LINE IS THE PROBLEM
(0x5589, 0x00), //<- AND THIS LINE
};
struct reg_val good_array[] = {
{0x5001, 0xff},
{0x5580, 0x01},
{0x5580, 0x02},
{0x5589, 0x00},
};
int main()
{
unsigned i;
unsigned faulty_size = sizeof(faulty_array)/sizeof(struct reg_val);
printf("Size of faulty array: %d\n", faulty_size);
for (i = 0; i < faulty_size; ++i) {
printf("faulty reg: %x val: %x\n", faulty_array[i].reg,
faulty_array[i].val);
}
unsigned good_size = sizeof(good_array)/sizeof(struct reg_val);
printf("\nSize of good array: %d\n", good_size);
for (i = 0; i < good_size; ++i) {
printf("good reg: %x val: %x\n", good_array[i].reg,
good_array[i].val);
}
return 0;
}
Tôi quen thuộc hơn với C và tôi ngạc nhiên này vẫn được biên soạn với g ++:
$ g++ -Wall array.cc
array.cc:11: warning: left-hand operand of comma has no effect
array.cc:12: warning: left-hand operand of comma has no effect
array.cc:13: warning: missing braces around initializer for ‘reg_val’
$ ./a.out
Size of faulty array: 3
faulty reg: 5001 val: ff
faulty reg: 5580 val: 1
faulty reg: 2 val: 0 <-- the first value gets discarded as mentioned in the compiler warning
Size of good array: 4
good reg: 5001 val: ff
good reg: 5580 val: 1
good reg: 5580 val: 2
good reg: 5589 val: 0
Mã này sẽ rõ ràng là thất bại trong việc biên dịch với một trình biên dịch C, những gì là khác biệt trong C + + mà làm cho một trình biên dịch C + + (mặc dù grudgingly) chấp nhận mã này?
Ah, cảm ơn bạn. Tôi hiểu rồi. Điều đó có ý nghĩa. Nhưng gcc dường như không phải là rất hạnh phúc về tôi "nẹp phẳng". '$ gcc -Wall array.c array.c: 13: warning: thiếu dấu ngoặc ôm quanh initializer' – Lucas
' gcc' với '-Wall' cũng sẽ cảnh báo bạn về' if (c = something()) 'vì' gợi ý dấu ngoặc đơn xung quanh bài tập được sử dụng làm giá trị true'. Chỉ vì một cái gì đó được cho phép bởi ANSI C không có nghĩa là nó sẽ không tạo ra một cảnh báo. –
bạn đúng, 'gcc -std = c89-biên dịch mảng array.c' không có cảnh báo. – Lucas