2011-03-17 2 views

답변

6

; open 구성원은 memory_open으로 초기화되고 나머지는 초기화되지 않은 상태로 유지됩니다. C99는 다른 구문 (.open = memory_open)을 사용합니다.

+1

오른쪽. GCC 문서에서는 1993 년에 발표 된 GCC 2.5 이후 구식 GNU 스타일 구문이 "쓸모가 없습니다"라고 말합니다. :-) – Ken

+2

"초기화되지 않은 부분"은 확실합니까? 일반적으로 C 언어에서는 all-or-nothing입니다. 즉 적어도 * something *이 초기화되면 다른 모든 것은 * zero-initialized *입니다. 이것이 C99에서 새로운 구문으로 작동하는 방식입니다. 물론 GCC 관련 확장은 다르게 동작 할 수 있습니다. – AnT

+0

확신 할 수는 없지만 이전 스타일의 초기화 프로그램에서 예전 스타일의 동작을 기대합니다. 전역 변수가 0으로 초기화되면 'auto' (스택) 변수는 그 메모리 공간을 사용하기 시작한 모든 쓰레기가됩니다. – geekosaur

3

C에서 선택적 후행 쉼표는 시간의 시작부터 중괄호로 묶은 이니셜 라이저에서 허용됩니다. 당신이 목록에서 초기화를 재 배열, 예를 들어,

struct SomeStructType s = { 
    value1, 
    value2, 
    value3, 
}; 

이 그것을 쉽게처럼 초기화에 균일 쉼표 배치를 사용할 수 있도록이 같은 필요성이 발생한다. 당신이 그것을 사용하든 원치 않든간에 개인적 취향의 문제입니다.

: 구문의 경우 @geekosaur가 이미 설명한대로 GCC 관련 확장입니다. 해당 기능은 C99에서 다른 구문으로 표준화되었습니다.

+0

그래서 당신을위한 시간의 시작은 C99입니까? 흥미로운 :) 나는 후행 쉼표 (이니셜 라이저와'enum ')가 추가되었다고 생각한다. –

+0

@Jens Gustedt : 아니요. C99에서 후행 쉼표가 * enums *에 구체적으로 허용되었습니다. 그리고 추가 된 이유 중 하나는 열거 형과 중괄호로 묶인 이니셜 라이저간에 오래된 오래된 불일치를 제거하는 것이 었습니다. 후자의 경우 쉼표는 C89 이전에 불법 이었지만 열거 형에서는 위의 쉼표가 C89/90 이후로는 처음부터 시간의 시작부터 허용되었습니다. – AnT

+0

. 나는 어딘가에 그것을 읽었다 고 확신하지만, 웹에서 검색하는 것은 나쁜 것을 가져 오지 않았다. –