source

GCC에서 이니셜라이저 주변의 브레이스가 누락됨

lovecheck 2023. 9. 19. 21:13
반응형

GCC에서 이니셜라이저 주변의 브레이스가 누락됨

아래 C에 이 구조가 있어서 모든 0으로 초기화하고 싶습니다.치아 교정기 누락 경고를 제거하려면 어떻게 해야 합니까?

typedef struct {
    uint32_t incoming[FRAME_TYPE_MAX];
    uint32_t outgoing[FRAME_TYPE_MAX];
    uint32_t timeouts;
    uint32_t crc_errors;
} pkt_t;

static pkt_t stats = {0};

이것은 GCC 버그 번호 53119입니다.

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119

만약 당신이 그것을 고치기를 원한다면, 그것이 당신에게 문제가 된다는 버그 보고서에 대한 후속 조치를 게시하세요.

구조물의 첫 번째 멤버는 배열이므로 다음이 필요합니다.

static pkt_t stats = {{0}};

외부 가새는 구조물을 위한 것이고, 내부 가새는 배열을 위한 것입니다.하지만 이 고양이의 가죽을 벗기는 방법은 여러 가지가 있습니다. (예를 들어, 정적은 이미 0으로 시작되었습니다.)

전역 변수 또는 로컬 정적 변수인 경우 자동으로 초기화됩니다.그래서 간단하게:

static pkt_t stats;

한 가지 방법은 가새 내부의 구조물의 모든 부재를 초기화하는 것이며, 이는 암시적인 영채움에 의존하는 것이는 가새 내부의 모든 부재를 초기화하는 것입니다.어레이 멤버의 경우 주의를 유발할 수 있는 다른 {}이(가) 필요합니다.또 다른 방법은 경고를 비활성화하는 것이지만, 합법적인 버그도 잡을 수 있기 때문에 권장되지 않습니다.

이 gcc 컴파일러 플래그 설정: -Wno-missing-braces

#define FRAME_TYPE_MAX 3

typedef struct {
    uint32_t incoming[FRAME_TYPE_MAX];
    uint32_t outgoing[FRAME_TYPE_MAX];
    uint32_t timeouts;
    uint32_t crc_errors;
} pkt_t;

static pkt_t stats1= { .incoming={5,6,20},
                       .outgoing={0,0,0},
                       .timeouts=0,
                       .crc_errors=0
                       };

static pkt_t stats2= { {5,6,20},
                       {0,0,0},
                       0,
                       0
                       };

static pkt_t stats3= {{0}};

pkt_t stats4 ;   // global


int main(void)
{

    stats1.incoming[0]= 35;
    stats1.timeouts=25;
    stats2.incoming[2]=10;  
    stats3.outgoing[2]=10;  
    stats4.timeouts=10;
    for (;;);
    }

이 잘못된 경고를 생략하는 gcc 버전에 여전히 있는 즐거움이 있다면 질문에 이와 같은 구조로 이 문제를 피할 수 있습니다.

typedef struct {
    uint32_t timeouts;
    uint32_t crc_errors;
    uint32_t incoming[FRAME_TYPE_MAX];
    uint32_t outgoing[FRAME_TYPE_MAX];
} pkt_t;

static pkt_t stats = {0};

from "info gcc"

GNU 확장자로서, GCC는 정적 저장 지속 시간을 갖는 객체를 복합 리터럴로 초기화할 수 있습니다(초기화자가 상수가 아니기 때문에 ISO C99에서는 불가능합니다).복합 리터럴과 객체의 유형이 일치하는 경우 괄호로 둘러싸인 목록만으로 객체를 초기화한 것처럼 처리됩니다.복합 리터럴의 이니셜라이저 목록은 일정해야 합니다.초기화 중인 개체의 배열 유형이 알 수 없는 경우 크기는 복합 리터럴 크기로 결정됩니다.

 static struct foo x = (struct foo) {1, 'a', 'b'};
 static int y[] = (int []) {1, 2, 3};
 static int z[] = (int [3]) {1};

위의 선들은 다음과 같습니다.

 static struct foo x = {1, 'a', 'b'};
 static int y[] = {1, 2, 3};
 static int z[] = {1, 0, 0};

배열의 모든 요소를 지정할 필요 없이 이러한 초기화기를 결합하여 배열의 gcc별 초기화를 허용할 수도 있습니다.또는... 플래그를 설정하고 필요할 때 실행 시 초기화할 수 있습니다.변수가 BSS에 있는지 여부를 확인할 수 있으며 자동으로 영점화될 수 있습니다(기능의 스택에 있는지, 전역 메모리에 있는지).

언급URL : https://stackoverflow.com/questions/11551986/gcc-missing-braces-around-initializer

반응형