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
'source' 카테고리의 다른 글
일부 URL을 제외한 IIS URL 다시 쓰기 역할 (0) | 2023.09.19 |
---|---|
리눅스에서 해당 pid의 프로세스 이름 (0) | 2023.09.19 |
장고에서 필터로 최신 기록 가져오기 (0) | 2023.09.14 |
Wordpress Database Class - MySQL 유형 비트 (0) | 2023.09.14 |
Wordpress Database Class - MySQL Type Bit (0) | 2023.09.14 |