, 그때 쓸 수 있습니다 :C90 복합 리터럴 C99에서
x = (v2) { 1, 2 };
을 v2
은 여기서
typedef struct {
int x;
int y;
} v2;
내가 C90에서 비슷한 일을 할 수 ?
, 그때 쓸 수 있습니다 :C90 복합 리터럴 C99에서
x = (v2) { 1, 2 };
을 v2
은 여기서
typedef struct {
int x;
int y;
} v2;
내가 C90에서 비슷한 일을 할 수 ?
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};
아니요, 이것은 C99 기능입니다. 그러나 일부 컴파일러에서는이를 C89 모드의 확장으로 사용할 수 있습니다. gcc.
는 컴파일러 확장없이 당신이 C90에서 얻을 수있는 가장 가까운 것 :
{
v2 temp = { 1, 2 };
x = temp;
}
당신이 압축 할 수있는 한 줄 또는 매크로로 대체하십시오. (C에는 위생적인 매크로가 없으므로 변수를 선언하는 매크로에주의해야합니다.)