반응형
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
반응형
'programing' 카테고리의 다른 글
String Builder와 String Buffer의 차이점 (0) | 2022.06.13 |
---|---|
Math.round(0.4999999999994)가 1을 반환하는 이유는 무엇입니까? (0) | 2022.06.13 |
Vue.js 컴포넌트 내의 모멘트 라이브러리를 사용하는 방법 (0) | 2022.06.13 |
리눅스에서 데몬 생성 (0) | 2022.06.13 |
STDIN_FILENO와 STDIN_FILENO의 차이점은 무엇입니까? (0) | 2022.06.13 |