2017-12-12 23 views
1

너무 긴 :이니셜 문자열은 내 코드에서이 구조체가 문자 []

struct Foo { 
    // more stuff but not important 
    char key[]; 
}; 

constexpr Foo foo[] = { 
    { "something" } 
}; 

및 GCC 컴파일러는이 오류가 발생합니다 :

error: initializer-string for array of chars is too long [-fpermissive]

어떤 아이디어 왜? 또는 어떻게 해결 될 수 있는가?

+7

'char key [];'는 크기가 없으므로 얼마나 걸리나요? 그리고 어쨌든, 다른'Foo'는 다른 크기를 가질 수 없습니다. –

+3

char 배열 대신'std :: string'을 사용해야합니다. 당신은 C가 아닌 C로 쓰고 있어요. –

+0

@mihai pop이 오류를 생성하는 코드를 보여줍니다. –

답변

1

자동 크기 조정 가야하는 표준 C++ 없습니다. 이 표준은 길이가 0 인 배열을 선언 할 수있게 해 주며, 명백한 유스 케이스를위한 것이지만 원하는 크기를 할당하는 방법을 말하지 않습니다.

일부 컴파일러는 확장으로 일부 기능을 지원합니다.

pre-template 일에서 깨끗하게하려면 사용자 지정 할당 자 operator new가 필요합니다. 요즘은 템플릿 인수로 크기 조절을 실제로하는 파생 된 템플릿 인스턴스 클래스로 래핑 할 수 있습니다. 배열 크기를 추론하는 템플릿 함수에서이를 반환 할 수 있습니다. 그러면 기본 배열을 사용할 수 있습니다.

4

경고는 길이가 가변적 인 key 변수의 문제점을 보여줍니다. 변수가 마지막 멤버 인 한 이러한 정의는 유효합니다. 컴파일러 버전 및 플래그에 따라 경고 또는 오류 일 수 있습니다. 나는 그것이 gcc 버그라고 여겨져 here라고 묘사했다고 생각한다. 경고 멀리 갈 수 있도록

간단한 수정과 같이 문자 배열에 대한 고정 값을 넣어하는 것입니다

struct Foo { 
    char key[10]; 
}; 

constexpr Foo foo[] = { 
    {"something"} 
}; 
std::cout<<foo[0].key; // prints out 'something' 

그러나, 한 가지 더 있습니다. Foo 개체 배열을 만들려고합니다. 현재 구현에서는 각 객체의 배열 길이가 key 일 것입니다. 이 객체간에 변경하려면

마지막 요소의 std::string