QTAudioFrequencyLevels and variable length array in a structure

QuickTime API내에서 사용되는 structure 중 AuidoFrequencyLevels라는 것이 있다. 이것은 다음과 같이 생겼다.

struct QTAudioFrequencyLevels {
  UInt32              numChannels;
  UInt32              numFrequencyBands;
                                              /* numChannels * numFrequencyBands entries, with the frequency bands for a single channel stored contiguously.*/
  Float32             level[1];
};

자, 여기서 제일 마지막 요소인 level을 보자. 크기가 1인 행렬로 되어 있다. (아… 행렬이란 말 참 오랜 만에 써본다.) 뭐 하느라고 이렇게 선언을 했을까? Apple의 Technical QA1459 : Easy Frequency Level audio Metering with MoviewAudio API를 보면 다음과 같이 쓰는 것을 볼 수가 있다.

QTAudioFrequencyLevels *freqResults = NULL;

...

// call this once per movie to establish metering
err = SetMovieAudioFrequencyMeteringNumBands(myMovie,
                                             kQTAudioMeter_StereoMix,
                                             &numberOfBandLevels);
if (err) goto bail;

freqResults = malloc(offsetof(QTAudioFrequencyLevels,
                              level[numberOfBandLevels * numberOfChannels]));
if (freqResults == NULL) {
    err = memFullErr;
    goto bail:
}

freqResults->numChannels = numberOfChannels;
freqResults->numFrequencyBands = numberOfBandLevels;

즉, dynamic length를 가지는 행렬로써 쓰고 있는 것이다.
음….
이거 말이지…
보통 이렇게 쓰지 않던가?

struct QTAudioFrequencyLevels {
  UInt32              numChannels;
  UInt32              numFrequencyBands;
  Float32             level[];

예전부터 이렇게 쓴 것으로 알고 있는데..
근데 GCC 문서를 보니, variable length를 지원하기 위해서 ISO C99에서는 바로 위의 예처럼 length자체가 없는 형식을 쓰는게 표준이고 ISO C90에서는 1이라고 길이를 명시해야 한단다.
근데 GCC에서는 자체 extension으로 0-length array를 지원한다고.
예전에 어디선가 인터뷰를 봤을때, 0-length array를 물어 봤었는데…
나원참 항상 standard 문서를 확인해보는 것도 아니고..
그리고 나는 가능하면 이런 extension은 쓰지 않는다. 왜냐하면 호환성에 문제가 생길 수있기 때문이다. 이를테면 예전에 삼성에 다닐때 ARM 프로세서를 사용하는 embedded system에서 프로그래밍을 했었는데, pSOSystem이 제공하는 컴파일러가 아주 오래된 사양을 지원하는 C/C++ 컴파일러였다. 물론 C++은 추천되는 대상이 아니었다. embedded system은 항상 C를 선호해왔으니까. 요새야 메모리 빵빵하니 C++을 적극 추천하지만… 근데 그때까지만해도 항상 새로운 표준을 열심히 공부하던 나로써는 당황스러웠다. PC에서 잘 되던 문법이 안되는 것이다. 회사에 제대로 된 pSOSystem 매뉴얼도 없고… 알고보니 오랜 표준만을 지원하고 있었던 것이다. 그 이후로는 가능하면 이곳 저곳에서 다 쓸 수있는 문법만을 쓴다. portability가 중요하기 때문에.

아무튼 Apple의 구현또한 옛날 컴파일러에서도 돌아가게 끔 되어 있는 것이다. 이런 사려깊은 것들 같으니라구.

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: