2009-06-30 3 views
4

와 형식 정의가 나는 오류가 라인 로프 Z =에 있습니다구조체 이니셜 라이저, 비주얼 스튜디오

typedef struct { 
    float x, y; 
} complexf; 

typedef union { 
    complexf f; 
    long long d; 
} rope; 

int main(void) 
{ 
    complexf a; 
    rope z = {a}; 
} 

비주얼 스튜디오와 함께 작동하지 않는 다음과 같은 이유 {A}, 떠 complexf에서 변환 할 수 없습니다 궁금합니다. 노동 조합의 첫 번째 구성원이 typedef가 아니면 작동합니다. 이것은 컴파일러 버그입니까, 아니면 C의 어두운 가장자리입니까?

VS 6.0

답변

5

ANSI C 표준 (일명 C89), 3.5.7 : 정적 저장을 기간 이 있거나 집계 또는 조합이있는 개체에 대한 초기화 목록의 개체에 대한 초기화 에서

모든 표현유형은 상수 표현이되어야합니다.

이 제한의 후반 부분은 VS에서 제대로 지원하지 않는 C99에서는 삭제되었습니다.

+0

고마워. 나는 이것이 괜찮다는 것에 다소 놀랐다. 로프 z; z.f = a; –

+0

당신은 정확히 무엇에 대해 놀랐습니까? 전체 구조체를 할당 할 수 있습니까? 그것은 완벽하게 유효합니다 (유니온은 물론 배열은 아닙니다). – Christoph

1

내가 컴파일/W4 내가 얻을

경고 C4204 : 사용되는 비표준 확장 : 일정하지 않은 집계 이니셜

그래서 그 날이 그렇지 않은 표준 C 생각하게하고 당신이 따라 컴파일러에 땅.

0

G++ 3.4.4Cygwin에 잘 작동합니다.

';'으로 변경해야 할 끝 부분의 ':'을 제외합니다.
그리고 '__int64''long long'으로 변경했습니다. 이러한 코드에 대한 C를 향한 나의 강한 편견으로


는, 나는

rope z = *(rope *)&a; 

는 C++ 컴파일러 :-)에에 강제로 기록 된 것입니다.
하지만, 그러지 마 ... 다윗이 자신의 의견에 노트로

갈 올바른 방법은 물론이고,

rope z; z.f = a; 
+0

포인터를 통해 처리하는 유형이 매우 추합니다. 유용했던 경우를 본 적이 없습니다. 노조는 형벌 벌이기에 훨씬 낫다. –

+0

사실, 컴파일러를 속여서 오류를 간과 할 가능성이 있습니다. 그러나, 나는 그것이 사용되는 것을 보았다. – nik

+0

나는 게으름에서 포인터를 던져서 타입 패닝을했지만, 유니온을 사용하는 것이 바람직하다. GCC는 그것들을 더 잘 최적화하고 가능한 정렬 문제를 피한다. – Christoph

관련 문제