빈 이니셜라이저 목록이 유효한 C 코드입니까?
사용하는 것은 일반적입니다.{0}
초기화하다struct
또는array
그러나 첫 번째 필드가 스칼라 유형이 아닌 경우를 고려하십시오.의 첫 번째 필드가struct Person
또 하나struct
또는 어레이를 지정하면 이 행에 오류가 발생합니다(error: missing braces around initializer
).
struct Person person = {0};
적어도 GCC를 사용하면 빈 이니셜라이저 목록을 사용하여 동일한 작업을 수행할 수 있습니다.
struct Person person = {};
하지만 이게 유효한 C코드인가요?
또한: 이 라인은 반드시 같은 동작(즉, 제로 초기화)을 제공합니까?struct
?
struct Person person;
아니요, 빈 이니셜라이저 목록은 허용되지 않습니다.이것은, GCC 로 컴파일 할 때도 표시됩니다.-std=c99 -pedantic
:
a.c:4: warning: ISO C forbids empty initializer braces
그 이유는 2011 ISO C 표준의 § 6.7.9에서 문법이 정의된 방식 때문이다.
initializer:
assignment-expression
{ initializer-list }
{ initializer-list , }
initializer-list:
designation(opt) initializer
initializer-list , designation(opt) initializer
이 정의에 따르면 initializer-list에는 적어도1개의 initializer가 포함되어 있어야 합니다.
C99 표준에 따르면 빈 이니셜라이저 목록을 사용한 어레이 작성은 금지됩니다.앞의 답변에서 문법은 이 경우를 설명하지 않는다는 것을 알 수 있습니다.
그러나 초기화하지 않고 어레이를 선언하면 어떻게 됩니까?사용하는 컴파일러에 따라 다릅니다.다음 간단한 예를 보겠습니다.int arr[5] = {}
.
GCC
디폴트gcc
이 코드를 컴파일하려고 해도 경고 또는 경고는 발생하지 않습니다.전혀 아니다-Wall
,그렇지만-Wpedantic
한다.
warning: ISO C forbids empty initializer braces
하지만 어쨌든gcc
어레이의 멤버를 명시적으로 지정한 것처럼 0으로 채웁니다.int arr[5] = {0}
어셈블리 출력 godbolt를 참조하십시오.
달그락달그락
단, 이 케이스에 대한 경고는 표시되지 않지만 옵션이 있는 기본값입니다.-Wgnu-empty-initializer
다음 작업을 수행합니다.
warning: use of GNU empty initializer extension
Clang은 다른 어셈블리 코드 godbolt를 생성하지만 동작은 동일합니다.
언급URL : https://stackoverflow.com/questions/17589533/is-an-empty-initializer-list-valid-c-code
'programing' 카테고리의 다른 글
키 누르기 vuejs에서는 소수점 2자리 제한이 있는 숫자와 점 하나만 허용 (0) | 2022.08.07 |
---|---|
메모리셋을 사용하는 것보다 메모리를 제로화하는 속도가 더 빠릅니까? (0) | 2022.08.07 |
vue-cli 웹 팩을 사용하여 생성된 Vue 앱에서 폰트 어썸 사용 (0) | 2022.08.07 |
물체에 수분을 공급한다는 것은 무슨 뜻입니까? (0) | 2022.08.03 |
vue-test-utils에서 마우스 오버 이벤트를 테스트하는 중 (0) | 2022.08.03 |