살아가는 이야기

C의 복합 상수(compound literal) 사용 예 본문

컴퓨터, 풀어그림

C의 복합 상수(compound literal) 사용 예

우균 2021. 10. 21. 12:26

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