2016-11-18 6 views
1

를 형성하기 위해 정의합니다. VERSION_MINOR와 REVISION 사이의 공간을 없애고 싶습니다. 나는 이것을 시도했다 :연결하여 전처리 내가이이 문자열을

#define VERSION VERSION_MAJOR.VERSION_MINOR##REVISION 

그러나 그것은 "1.VERSION_MINORREVISION"를 산출한다. 물론,이 작동하지 않습니다 중 하나

#define VERSION VERSION_MAJOR.VERSION_MINORREVISION 

그 사이에 공백이없이 두 전처리 값을 연결할 수 있습니까?

답변

0

더 파고 나면 실제로 가능하다는 것을 알았습니다.

#define VERSION_MAJOR 1 
#define VERSION_MINOR 0 
#define REVISION b 
#define _STRINGIFY(x) #x 
#define STRINGIFY(x) _STRINGIFY(x) 

/* here's the magic */ 
#define _CONCAT(x,y) x##y 
#define CONCAT(x,y) _CONCAT(x,y) 
#define VERSION VERSION_MAJOR.CONCAT(VERSION_MINOR,REVISION) 

int version_major = VERSION_MAJOR; 
int version_minor = VERSION_MINOR; 
char *revision = STRINGIFY(REVISION); 
char *version_string = STRINGIFY(VERSION); 

STRINGIFY 마찬가지로, 매크로 CONCAT 작동하도록 두 가지 수준으로 정의 될 필요가있다.

출력은 :

int version_major = 1; 
int version_minor = 0; 
char *revision = "b"; 
char *version_string = "1.0b"; 

예상.

1

C에서 서로 옆에있는 두 개의 문자열은 단일 문자열로 취급되어 자동으로 연결됩니다. 따라서 "abc" "def" 인 경우 "abcdef"과 같습니다. 마찬가지로 A와 B에 대한 매크로가있는 경우 #A #B을 매크로를 연결합니다.

예를 들어,이 코드는 당신이 찾고있는 VERSION_STRING을 생산해야합니다

#define VERSION_MAJOR 1 
#define VERSION_MINOR 0 
#define REVISION b 
#define STRINGIFY(x) #x 
#define VERSION_STR(A,B,C) STRINGIFY(A) "." STRINGIFY(B) STRINGIFY(C) 
char *version_string = VERSION_STR(VERSION_MAJOR, VERSION_MINOR, REVISION); 
+0

내가이 캐릭터 라인 화에 간접 수준을했다 실현; 다른 매크로를 위해 다시 넣고 싶다면 괜찮습니다. –