2009-06-23 3 views
3

Solaris에서 구조체 msghdr에 msg_control 필드를 가져오고 IPV6_TCLASS를 갖기 위해 _XPG4_2 및 __EXTENSIONS__을 정의해야합니다._XPG4_2 및 다른 정의가 Solaris에서 어떻게 작동합니까?

그냥 아무것도 포함하기 전에 1이를 정의하면 작동하는 것 같다

:

#if defined (__SVR4) && defined (__sun) 
# define _XPG4_2 1 
# define __EXTENSIONS__ 1 
#endif 
  1. 내가 그것을 이런 식으로해야 하는가를?
  2. 모든 소스 파일에서이 파일을 정의해야합니까? 그렇지 않으면 좋지 않은 결과가 발생할 수 있습니까?
  3. 어딘가에 이러한 것들의 목록이 있습니까?

이것은 this question과 관련됩니다.

답변

8

man -k XPG4는 다음과 같은 다양한 표준에 대한 기능 테스트 매크로 및 라이브러리 링크 정보를 나열하는 standards(5) 매뉴얼 페이지가 있음을 알 수 :

X 구축하거나 응용 프로그램을 컴파일하려면 열기/CAE 그 X/Open CAE 사양 중 하나를 준수하는 경우 다음 지침을 따르십시오. 에 CAE 및 POSIX 기능이 모두 필요한 경우 응용 프로그램에서 POSIX 기능 테스트 매크로를 설정할 필요가 없습니다. _XOPEN_SOURCE에 대한 /usr/include을 통해 Grepping

SUS (XPG4v2) 
     The application must define _XOPEN_SOURCE with a value 
     other than 500 (preferably 1) and set 
     _XOPEN_SOURCE_EXTENDED=1. 

/usr/include/sys/feature_tests.h에서 더 많은 정보를 전환 : X/열기 UNIX 확장으로 지정된 기능을 사용하고자하는

응용 프로그램의 작가 _XOPEN_SOURCE_XOPEN_SOURCE_EXTENDED=1를 정의해야합니다. 예기치 않은 결과가 발생할 수 있으므로 Sun의 내부 매크로 _XPG4_2을 사용하지 마십시오.

따라서 _XPG4_2을 직접 정의하는 것은 아닙니다.

구조 정의가이 매크로에 의존하는 경우 모든 번역 단위에서 구조 정의를 정의하는 것이 좋습니다.

: 당신이 make를 사용하는 경우

cc -D_XOPEN_SOURCE=1 -D_XOPEN_SOURCE_EXTENDED=1 

, 당신은 CFLAGS 변수에 -D 매개 변수를 추가하여이 작업을 수행 할 수 있어야한다 : 그 작업을 수행하는 가장 쉬운 방법은 컴파일러 명령 줄에 지정하는 것입니다

CFLAGS += -D_XOPEN_SOURCE=1 -D_XOPEN_SOURCE_EXTENDED=1