2017-11-13 9 views
2

범위/함수 안에 넣을 때 다음 코드를 컴파일 할 수 없으면 컴파일러에서 initializer element is not constant 행을 따라 오류가 발생합니다. 이것은 MSVC뿐만 아니라 GCC에서도 발생합니다. 복합 문자로 변수 초기화

static const char *const *const list = (const char *const[]){"abc", "def", "xyz"}; 

그러나 코드가 정적 저장 기간이 전역 변수로하는 함수의 외부에 넣어되고 list가 초기화 될 때, 코드는 잘 컴파일 경고 나 오류를 생성하지 않습니다. list이 비 정적 인 경우에만 스코프/함수 내에서 초기화 될 수 있습니다.

cppreference docs의 다음 인용문 내 눈을 사로 잡은했습니다

문자 그대로의 화합물이 파일 범위와 자동 스토리지 지속 기간의 경우에 발생하는 경우 화합물 리터럴 평가하여 정적 저장 기간이있는에 익명의 객체 복합 리터럴은 블록 ​​ 범위에서 발생합니다 (이 경우 객체의 수명은 닫는 블록의 끝에서 끝납니다).

정적 저장소 기간의 로컬 변수를 복합 문자로 초기화 할 수 없다는 것은 안전한가요?

답변

1

정적 저장 기간이있는 개체는 상수 식으로 초기화 할 수 있습니다. 복합 리터럴은 상수가 아닙니다 (실제로는 lvalues ​​임). 복합 리터럴을 사용하여 정적 저장 기간이있는 객체는 초기화 할 수 없습니다 (GCC에서 확장을 허용 함).