방금 C++에서 불쾌한 버그가있었습니다. 그래서 레지스터와 값 목록을 구조체에 래핑 한 다음 해당 구조체를 배열로 초기화합니다. 그런데 실수로 {}
대신 ()
을 입력했습니다.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는 나에 대해 매우 만족스럽지 않은 것처럼 보입니다. '$ gcc -Wall array.c array.c : 13 : warning : initializer 주변에 괄호가 없다' – Lucas
'-gall'을 사용하는'gcc'는'괄호를 제안하기 때문에'if (c = something())' 진리 값으로 사용 된 주위의 과제 '에 해당한다. ANSI C에 의해 허용 된 것이 경고를 생성하지 않는다는 것을 의미하지는 않습니다. –
당신이 옳다면,'gcc -std = c89 -pedantic array.c'는 경고없이 컴파일됩니다. – Lucas