살아가는 이야기
C의 복합 상수(compound literal) 사용 예 본문
ISO C99부터 복합 상수(compound literal)를 이용하여 대입 연산(assignment)을 수행할 수 있다. 복합 상수란 하나 이상의 상수로 구성된 상수를 뜻한다. int형 변수 a에 정수 10을 저장할 수 있는 것처럼,
a = 10;
int 쌍으로 구성된 IPair라는 자료형의 변수 p에 다음과 같이 저장할 수 있다.
p = (IPair) {a, a+a};
복합 상수를 이용하여 문자열 상수 값과 문자열의 길이를 모두 저장하고 있는 문자열 형 String을 만들고 테스트해 보았다. 이 예는 다음과 같다.
#include <stdio.h>
#include <string.h>
typedef struct {
char *val;
int len;
} String;
int main()
{
char a[] = "Hello";
String s = {a, strlen(a)};
puts(s.val);
char b[] = "World";
s = (String) {b, strlen(b)};
puts(s.val);
return 0;
}
이 프로그램에서 b와 b의 길이를 s에 저장하는 부분이 바로 복합 상수를 대입하는 부분이다. a와 a의 길이를 저장하는 부분에 있는 {a, strlen(a)}는 복합 상수와 비슷한 형태이지만 복합 상수가 아니라 초기화 목록(initializer)이다.
위 프로그램의 수행 예는 다음과 같다.
이와 같은 복합 상수는 함수에서 반환 값을 정할 때 더 유용하다. 다음은 생성자 함수 mkstring을 이용하여, 같은 일을 하도록 수정한 프로그램이다.
#include <stdio.h>
#include <string.h>
typedef struct {
char *val;
int len;
} String;
String mkstring(char s[]) {
return (String) {s, strlen(s)};
}
int main()
{
String s = mkstring("Hello");
puts(s.val);
s = mkstring("World");
puts(s.val);
return 0;
}
mkstring의 반환 값을 결정할 때 복합 상수식 {s, strlen(s)}가 사용된 것을 볼 수 있다. mkstring의 반환 자료형이 String이지만 복합 상수식 앞의 (String)을 생략하면 안 된다. 생략하면 컴파일 오류가 발생한다.
Comments