我剛在C++中遇到了一個令人討厭的bug。所以我有寄存器和值的列表,它們被包裝在一個結構中,然後這些結構被初始化爲一個數組。但後來我意外地輸入了()
而不是{}
。下面是一些測試代碼:C++和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;
}
我比較熟悉C讓我吃驚,這仍然與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
此代碼顯然會失敗,C編譯器來編譯,有什麼使C++編譯器(儘管勉強接受)接受此代碼的C++中的差異?
啊,謝謝。我懂了。這就說得通了。但海灣合作委員會似乎不是很高興我「扁平括號」。 '$ gcc -Wall array.c array.c:13:warning:初始化程序周圍缺少大括號' – Lucas 2012-07-19 17:24:07
'gcc' with'-Wall'也會警告你'if(c = something())',因爲'建議括號用作真值的周圍分配「。只是因爲ANSI C允許的東西並不意味着它不會產生警告。 – 2012-07-19 17:57:04
你是對的,'gcc -std = c89 -pedantic array.c'編譯沒有警告。 – Lucas 2012-07-19 18:03:59