2016-11-18 10 views
1

を形成するように定義しています。 VERSION_MINORとREVISIONの間のスペースを無くしたい。私はこれを試しました:連結しプリプロセッサは、私がこれを持っている文字列

#define VERSION VERSION_MAJOR.VERSION_MINOR##REVISION 

しかしそれは"1.VERSION_MINORREVISION"を生成します。明らかに、これはどちらか動作しません:

#define VERSION VERSION_MAJOR.VERSION_MINORREVISION 

は、間に空間を有することなく、2つのプリプロセッサの値を連結することは可能ですか?

答えて

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それを動作させるために、2つのレベルで定義する必要があります。

出力は次のとおり

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

予想通り。

1

Cの中で隣り合う2つの文字列は、単一の文字列として扱われ、自動的に連結されます。したがって、"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

を私は文字列化に間接のレベルを取り出したことを実現します。それを他のマクロのために戻したいのであれば問題ありません。 –

関連する問題