2012-11-03 1 views

답변

3

C++ 03에서 언급 한 것처럼 비 정적 멤버 배열을 초기화 할 수 없습니다. g ++에서 이니셜 라이저 목록의 확장자를 가질 수 있지만 C++ 11 기능입니다. 당신이 4로 차원을 언급 할 수 있지만

char str[] = "str"; // (1) 
char str[] = {'s','t','r',0}; // (2) 

하지만 가 범위 밖으로 실수 배열을 방지하기 위해을 언급하지 않은 더 나은 : 함수에

지역 변수는 다음과 같이 초기화 할 수 있습니다.

두 경우 모두 std::string을 사용하는 것이 좋습니다.

+0

Comeau는 C++ 03 모드에서 둘 다 컴파일됩니다. 이유는 무엇입니까? – FrozenHeart

+0

문자 배열을 이런 식으로 초기화 할 수 없다고 생각하는 이유는 무엇입니까? 표준 및 gcc 버그 데이터베이스 (내 대답 참조)에서 읽은 것으로부터 문자 배열을이 방법으로 초기화 할 수있는 것처럼 보입니다. – bames53

1

C++ 03에서는 가능하지 않습니다. Comeau는 표준이 아닌 확장으로 인해 컴파일 할 수 있습니다. 당신은 버전에 관계없이 std::string 또는 std::vector<char> 사용을 고려할 수, 또한

class Foo 
{ 
public: 
    Foo() {} 
    char str[4] = "str"; //in-class initialization (C++11 only) 
}; 

:이 intead을 선호 할 수도,

Foo() : str({'s','t','r'}) {}  //C++11 only 

을 또는 : C에서

11 ++, 당신은이 작업을 수행 할 수 있습니다 당신이 사용하고있는 C++.

+0

Comeau는 ISO에 부합하는 엄격한 컴파일러이므로 확장 기능인지 확신 할 수 없습니다. 확실합니까? – FrozenHeart

+0

@NikitaTrophimov : C++ 03에서는 그렇게 할 수 없다는 것을 확신하지 못했습니다. – Nawaz

+0

GCC가 이것을 거부했다는 사실은 GCC 버그 리포터의 버그로 확인되었습니다. – bames53

4

이 코드는 유효한 C++ 03이며 gcc는 여기에 적합하지 않습니다.

문자 배열을 초기화 할 때이 구문을 허용하는 언어는 다른 유형과 마찬가지로 사용할 수 있습니다. 문자 배열에 사용되는 것을 금지하는 예외는 없습니다. ()= 초기화는 이러한 경우에 동일하며 문자 배열은 8.5.2에 따라 간단히 초기화해야합니다.

Here's 확인 된 gcc 버그 보고서입니다.

+0

+1, 참으로 gcc 버그. gcc는 오류를 인쇄하여 비표준 구조로 나타납니다. – iammilind

관련 문제