2011-04-14 3 views
5
void main(){  
    int[3] arr = [1, 2, 3,];  
} 

여분의 쉼표가 올바른지 또는 컴파일러 버그로 인해 오류로 플래그되지 않았습니까? 끝에 여분의 쉼표가있는 배열을 생성하는 많은 믹스 인이 있습니다. 나는 그들을 제거 할 시간을 가져야하는지 알고 싶다.배열의 나머지 쉼표

에도이 오류없이 컴파일 :

void main(){  
    int[3] arr = [1, 2, 3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,];  
} 
+0

더 이상 D2에서는 작동하지 않습니다. – user1461607

답변

7

나는 그것이 일반적인 방식으로 작업 할 수 템플릿 (또는 유지 mixin)을 허용하기 위해 법률의 생각 :

template Foo(T) { }      //What if Foo is empty like this? 

auto arr = [1, 2, Foo!(int), Foo!(long)]; 
//   [1, 2, , ] 

그것은 만든다 템플릿 을 사용하면 작업하기가 더 쉽습니다. 따라서 특수 출력에 대해 특수한 경우가 필요하지 않습니다.

더 현실적인 예 : ab 동일한 경우

template Iota(size_t start, size_t end) //All integers in range [start, end) 
{ 
    static if (start < end) 
     alias TypeTuple!(start, Iota!(start + 1, end)) Iota; 
    else 
     alias TypeTuple!() Iota; 
} 

auto arr1 = [-10, Iota!(0, 3)]; // arr is now [-10, 0, 1, 2] 
auto arr2 = [-10, Iota!(a, b)]; // arr is now [-10, a .. b] 

지금 무슨 일이? 그런 다음 arr2[-10, ]으로 붕괴됩니다.

+0

또한 코드 생성에 편리 할 수 ​​있습니다. – cybevnm

+0

이것이 합법적 인 이유입니다. @vnm, 템플릿은 코드 생성입니다. –

+3

IIRC는 문자열 혼합을 제외하고 여기에 언급 된 모든 사례가 텍스트가 아닌 데이터 구조로 확장되어 있기 때문에이 대답은 거의 부적절하다고 생각합니다. 즉 쉼표는 템플릿 확장 코드가 아닌 파서에만 관련되어 있습니다. – BCS

4

이 같은 서식 코드를 할 수 있도록 여러 언어로 사용할 수있다 :

string[3] arr = [ 
    "Some long String", 
    "And another", 
    "etc, etc, etc", 
    ]; 

마지막 값에서 쉼표를 생략하지 않고.

Java는 이러한 배열 초기화기를 허용합니다.

3

.NET now support trailing comma in array like python does

많은 컴파일러가 배열에 쉼표를 후행 수 있도록이 게시물을 확인하시기 바랍니다.

+1

C++은 하나의 후행 쉼표 만 허용합니다. 하나 이상의 오류는 오류입니다. 저는 C++에서 왔습니다. 그리고 D 컴파일러의 현재 상태로, 나는 무엇을 생각해야할지 확신하지 못했습니다. – Arlen

1

저는 단일 쉼표가 설계 상으로는 99 %입니다. 2, 3 등? IMHO, 이것은 설계 또는 구현의 버그이지만 어떤 버전인지 모릅니다.

1

몇 개월 전 Walter는이 동작을 dmd에 위임했습니다. 전에는 후행 쉼표가 때때로 허용되고 때로는 그렇지 않았고, dmd1 지역에 있다면 그걸로 고생했습니다.

이제 dmd2의 경우 최소한 매개 변수 목록, 인수 목록 및 템플릿 인수 목록뿐만 아니라 배열 리터럴에서도 후행 쉼표가 항상 유효해야합니다.

그러나 여러 개의 후행 쉼표는 구현시 버그입니다.