C 전처리기를 사용하여 int를 문자열에 연결


90

C를 사용하여 #define'd int를 #define'd 문자열에 연결할 수있는 방법을 알아 내려고합니다. 전처리기를 . 내 컴파일러는 CentOS 5의 GCC 4.1입니다. 솔루션은 MinGW에서도 작동합니다.

버전 번호를 문자열에 추가하고 싶지만 작동하도록 할 수있는 유일한 방법은 문자열로 정의 된 버전 번호의 복사본을 만드는 것입니다.

내가 찾을 수있는 가장 가까운 것은 매크로 인수를 인용하는 방법 이었지만 #defines 에서는 작동하지 않습니다.

이것은 작동하지 않습니다.

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER

#값이 숫자이고 "/home/user/.myapp" 2 6유효한 C 가 아닌로 확장되기 때문에 s 없이는 작동하지 않습니다 .

이것은 작동하지만 버전 정의의 사본을 갖는 것을 좋아하지 않습니다. 숫자로도 필요하기 때문입니다.

#define MAJOR_VER 2
#define MINOR_VER 6
#define MAJOR_VER_STR "2"
#define MINOR_VER_STR "6"
#define MY_FILE "/home/user/.myapp" MAJOR_VER_STRING MINOR_VER_STRING

답변:


171

고전적인 C 전 처리기 질문 ....

#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" STR(MAJOR_VER) STR(MINOR_VER)

추가 수준의 간접 지정을 사용하면 전처리 기가 매크로를 문자열로 변환하기 전에 확장 할 수 있습니다.


3
이 경우 STR ()은 좁은 문자열을 제공합니다. 이것을 넓은 문자열로 변환하는 변형이 있습니까?
gkns

5
내가 봤이 정확한 대답에서 복사 몇 번이나 내가 말할 수 있지만, 두 자리에있을거야
MightyPork

1
첫 번째 "STR_HELPER"는 '#'이 매크로 인수에서만 작동하기 때문에 필요합니다. 그것을 알아내는 데 언젠가 걸렸습니다 ..
clarkttfu

1
@clarkttfu, 일종의-예, #매크로 인수에서만 작동합니다. 그러나 STR_HELPER매크로 MAJOR_VER를 문자열로 변환 하지 않으 려면 매크로가 필요 "MAJOR_VAR"합니다 "2".
Lindydancer

13

작동 방법은 MY_FILE을 파라 메트릭 매크로로 작성하는 것입니다.

#define MY_FILE(x,y) "/home..." #x #y

편집 : "Lindydancer"에서 언급했듯이이 솔루션은 인수에서 매크로를 확장하지 않습니다. 보다 일반적인 솔루션은 다음과 같습니다.

#define MY_FILE_(x,y) "/home..." #x #y
#define MY_FILE(x,y) MY_FILE_(x,y)

1
제 솔직한 의견으로는 이것이 최선의 답변이며 다른 제안보다 훨씬 간단합니다. 더 나은 평가를받지 못한 것이 놀랍습니다!
osirisgothra

5
불행히도 작동하지 않는 깨끗한 솔루션입니다. 전달 된 인수 MY_FILE가 매크로 (예 : A및) B인 경우이 매크로는로 확장됩니다 "/home..." "A" "B".
Lindydancer 2014 년

2

BOOST_PP_STRINGIZE로 할 수 있습니다 .

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" BOOST_PP_STRINGIZE(MAJOR_VER) BOOST_PP_STRINGIZE(MINOR_VER)

28
사람들이 모든 것에 Boost를 던지는 방법을 우스꽝스럽게 만듭니다.
Frerich Raabe 2011 년

4
@Frerich : 당신의 주장을 극단적으로 받아들이면, 사람들은 모든 것에 g ++를 던지기보다는 원시 기계 코드로 먼저 자신의 컴파일러를 작성해야합니다 ... 바퀴를 재발 명 할 필요가 없습니다. 좋은 프로그래머는 코드를 작성하고 훌륭한 프로그래머는 재사용합니다.
Maxim Egorushkin 2011 년

@jonescb : 부스트 헤더를 열고 직접 확인하십시오.
Maxim Egorushkin 2011 년

10
네, 시도했습니다. 작동했지만 C 프로그램에서 Boost 헤더를 사용하는 것이 이상하게 보입니다.
jonescb 2011 년

1
아, 맙소사, C태그를 눈치 채지 못했습니다 .
Maxim Egorushkin 2011 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.