티스토리 뷰
Visual Studio에서 Linux 프로젝트를 이용하여 간단한 프로젝트 작성을 하고 있었습니다. sigaction 함수를 사용하기 위해 struct sigaction 구조체를 정의하려고 할 때 나타나는 구문입니다.
다음 그림과 같이 인텔리센스가 '불완전한 형식은 사용할 수 없습니다' 에러를 뱉었고, 실제로도 원격 컴파일에서 컴파일에 실패하였습니다.
해결
두 가지 해결 방법이 있습니다.
첫 번째 방법은 컴파일러 표준을 c11에서 gnu11로 바꿔주는 것입니다(-std:gnu11). 이 경우, gnu11에서 정의된 struct sigaction이 활성화 됩니다. 이 경우, sigaction 이외에도 다양한 c표준은 아니지만 gnu 표준인 함수들까지 사용할 수 있게 되는 side effect를 발생시킵니다.
또한, sigaction이 다음과 같이 정의됩니다.
두 번째는 다음과 같이 디파인을 하나 추가하는 것입니다 :
#define _XOPEN_SOURCE 200 // 값에 따라 sigaction 정의가 달라집니다.
#include <signal.h> // 디파인 값은 최대한 위에 정의하시면 에러로부터 편리는 합니다.
...
이 경우, 다음과 같이 정의됩니다 :
단순히 디파인 문을 하나 추가했을 뿐인데, 문제가 해결됩니다. 이러한 문제는 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)
'개발 > Miscellaneous' 카테고리의 다른 글
구글 프로토콜 버퍼(Google protocol buffer) (0) | 2020.05.13 |
---|---|
객체 지향적 관점에서의 has-a와 is-a 차이점 (1) | 2020.05.04 |
퍼포스 로컬 서버 구축하기(Perforce local Server) (0) | 2020.04.26 |
리눅스마스터 2급 실기 정리 (15) | 2020.04.24 |
memset 사용시 주의할 점 (1) | 2020.03.04 |
- Total
- Today
- Yesterday
- Auto
- 구간합
- P4 Stream
- P4 Streams
- Perforce Stream
- Perforce Streams
- DXGI
- Visual Studio C1083
- GoogleTest
- visual studio hot reload
- 알고리즘
- C# 람다식
- MSVC C1083
- C# 익명함수
- code copyright
- C7568
- C++
- 퍼포스 스트림
- UE4
- c++ hot reload
- game hot reload
- visual studio 핫 리로드
- 행렬
- 구글테스트
- 코드 저작권
- C# lambda expression
- 퍼포스 개요
- c++ 핫 리로드
- C++ Compile error
- 언리얼 엔진
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |