티스토리 뷰

Visual Studio에서 Linux 프로젝트를 이용하여 간단한 프로젝트 작성을 하고 있었습니다. sigaction 함수를 사용하기 위해 struct sigaction 구조체를 정의하려고 할 때 나타나는 구문입니다.

 

다음 그림과 같이 인텔리센스가 '불완전한 형식은 사용할 수 없습니다' 에러를 뱉었고, 실제로도 원격 컴파일에서 컴파일에 실패하였습니다.

 

 

 

해결


두 가지 해결 방법이 있습니다.

 

첫 번째 방법은 컴파일러 표준을 c11에서 gnu11로 바꿔주는 것입니다(-std:gnu11). 이 경우, gnu11에서 정의된 struct sigaction이 활성화 됩니다. 이 경우, sigaction 이외에도 다양한 c표준은 아니지만 gnu 표준인 함수들까지 사용할 수 있게 되는 side effect를 발생시킵니다.

 

또한, sigaction이 다음과 같이 정의됩니다.

뭔가 복잡해진 sigaction이 정의됩니다.

 

두 번째는 다음과 같이 디파인을 하나 추가하는 것입니다 :

#define _XOPEN_SOURCE 200    // 값에 따라 sigaction 정의가 달라집니다.
#include <signal.h>            // 디파인 값은 최대한 위에 정의하시면 에러로부터 편리는 합니다.
...

 

이 경우, 다음과 같이 정의됩니다 :

sa_restorer가 있는 건 신경쓰이지만, 저희가 아는 그 sigaction입니다.

단순히 디파인 문을 하나 추가했을 뿐인데, 문제가 해결됩니다. 이러한 문제는 c 표준과 맞지 않는 X/Open 및 POSIX 표준과 맞지 않음에서 발생합니다. 위 시스템에서 비표준 구문들을 숨기기 위해 별도의 디파인 문을 정의해 주지 않으면 사용할 수 없도록 숨겨놓은 것입니다.

 

이러한 것들을 FEATURE_TEST_MACORS 페이지에서 설명하며 참조한 레퍼런스에 더 많은 내용이 있으니 확인하시기 바랍니다.

 

여기서 알아둬야 할 것은 struct sigaction을 사용하기 위해서는 _XOPEN_SOURCE 값이 정의되어야 한다는 것입니다. 만약 _XOPEN_SOURCE 값을 300 이상으로 올리면 결과적으로 첫 번째 방법으로 정의된 형식과 같아집니다.

 

이것 이외에도 c 표준에서 정의되지 않은 비표준 구현들을 발견하게 된다면 이번에처럼 당황하지 마시고 대응되는 FEATURE_MACRO를 찾아보시기 바랍니다.

 

물론 호환성을 위해서라면 사용을 자제하는 것이 좋습니다.

 

 

 

레퍼런스


stackoverflow - struct sigaction incomplete error
stackvoerrun - What does -D _XOPEN_SOURCE do/mean?
man7.org - FEATURE_TEST_MACRO (7)

댓글