programing

빈 이니셜라이저 목록이 유효한 C 코드입니까?

firstcheck 2022. 8. 7. 16:27
반응형

빈 이니셜라이저 목록이 유효한 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

반응형