2012-05-24 4 views
3

, 그때 쓸 수 있습니다 :C90 복합 리터럴 C99에서

x = (v2) { 1, 2 }; 

v2은 여기서

typedef struct { 
    int x; 
    int y; 
} v2; 

내가 C90에서 비슷한 일을 할 수 ?

답변

2

AFAIK, 화합물 리터럴은 C99에 정확히 도입되었습니다. 그러나 GCC를 사용하는 경우이 기능을 확장으로 사용할 수 있습니다. 인용 부호 GCC docs :

ISO C99는 복합 리터럴을 지원합니다. 복합 리터럴은 이니셜 라이저가 포함 된 캐스트처럼 보입니다. 이 값은 이니셜 라이저에 지정된 요소를 포함하는 캐스트에 지정된 유형의 객체입니다. 그것은 lvalue입니다. 확장으로 GCC는 C90 모드와 C++에서 복합 리터럴을 지원합니다.

GCC의 기능과 관련된 다른 참고 : 이니셜이므로 GNU 확장으로

를 GCC는 ISO C99에서 불가능 화합물 리터럴 정전기 저장 기간 (가진 개체 초기화를 허용 상수가 아닙니다). 복합 리터럴과 객체의 유형이 일치하는 경우 객체가 괄호로 묶인 목록으로 만 초기화 된 것처럼 처리됩니다. 복합 리터럴의 초기화 프로그램 목록은 반드시 일정해야합니다. 초기화되는 객체가 알 수없는 크기의 배열 유형을 갖는 경우 크기는 복합 리터럴 크기에 의해 결정됩니다.

static struct foo x = (struct foo) {1, 'a', 'b'}; 
static int y[] = (int []) {1, 2, 3}; 
static int z[] = (int [3]) {1}; 

위의 라인은 다음과 동일합니다

static struct foo x = {1, 'a', 'b'}; 
static int y[] = {1, 2, 3}; 
static int z[] = {1, 0, 0}; 
1

아니요, 이것은 C99 기능입니다. 그러나 일부 컴파일러에서는이를 C89 모드의 확장으로 사용할 수 있습니다. gcc.

2

는 컴파일러 확장없이 당신이 C90에서 얻을 수있는 가장 가까운 것 :

{ 
    v2 temp = { 1, 2 }; 
    x = temp; 
} 

당신이 압축 할 수있는 한 줄 또는 매크로로 대체하십시오. (C에는 위생적인 ​​매크로가 없으므로 변수를 선언하는 매크로에주의해야합니다.)