programing

C에서 프리프로세서 변수를 인쇄할 수 있습니까?

prostudy 2022. 6. 13. 22:23
반응형

C에서 프리프로세서 변수를 인쇄할 수 있습니까?

C의 프리프로세서 변수 값을 stderr로 인쇄할 수 있습니까?예를 들어, 현재 가지고 있는 것은 다음과 같습니다.

#define PP_VAR (10)
#if (PP_VAR > 10)
    #warning PP_VAR is greater than 10
#endif

하지만 내가 하고 싶은 건

#define PP_VAR (10)
#if (PP_VAR > 10)
    #warning PP_VAR=%PP_VAR%
#endif

C에서 이런 일이 가능합니까?

Visual Studio에서 프리프로세서 변수 값을 인쇄할 수 있습니다.다음으로 _MSC_VER 값을 출력합니다.

#define STRING2(x) #x
#define STRING(x) STRING2(x)

#pragma message(STRING(_MSC_VER))

하지만 이것이 얼마나 표준적인지 잘 모르겠다.

이것은 GCC 4.4.3에서 동작합니다.

#define STRING2(x) #x
#define STRING(x) STRING2(x)
#pragma message "LIBMEMCACHED_VERSION_HEX = " STRING(LIBMEMCACHED_VERSION_HEX)

수율:

src/_pylibmcmodule.c:1843: note: #pragma message: LIBMEMCACHED_VERSION_HEX = 0x01000017

많은 C 컴파일러가 지원#warning(단, C 표준에서는 정의되어 있지 않습니다).

그러나 GCC는 적어도 후속 데이터에 대해서는 전처리를 하지 않기 때문에 변수의 값을 확인하기 어렵습니다.

#define PP_VAR 123
#warning "Value of PP_VAR = " PP_VAR
#warning "Value of PP_VAR = " #PP_VAR
#warning "Value of PP_VAR = " ##PP_VAR

GCC는 다음을 실현합니다.

x.c:2:2: warning: #warning "Value of PP_VAR = " PP_VAR
x.c:3:2: warning: #warning "Value of PP_VAR = " #PP_VAR
x.c:4:2: warning: #warning "Value of PP_VAR = " ##PP_VAR

프리프로세서 토큰 붙여넣기 연산자 ##TOKEN_NAME을 사용합니다.

앞서 설명한 바와 같이 사용하고 있는 프리프로세서 디렉티브는 비표준이므로 YMMV입니다.

음, 당신이 하고 있는 일은 사실 비표준적입니다.첫째, "#warn" 또는 "#warn" 지시는 표준이 아닙니다.두 번째로 프리프로세서를 사용할 경우 행은 공백 없이 파운드 기호로 시작해야 합니다.

#ifdef BLAH1# define BLAH2 // OK, 파운드는 맨 왼쪽에 있기 때문입니다.
#엔디프
#ifdef BLAH3#define BLAH4 // 많은 컴파일러에서 동작하지만 비표준입니다.
#엔디프

이미 비표준 확장자를 사용하고 있기 때문에 사용하고 있는 특정 프리프로세서/컴파일러의 매뉴얼을 참조하여 "#warning"에 대한 내용을 확인해야 합니다.

언급URL : https://stackoverflow.com/questions/1204202/is-it-possible-to-print-a-preprocessor-variable-in-c

반응형