4

私はこれを持っています:

#define VERSION_MAJOR 1
#define VERSION_MINOR 0
#define REVISION b
#define VERSION VERSION_MAJOR.VERSION_MINOR REVISION
#define _STRINGIFY(x) #x
#define STRINGIFY(x) _STRINGIFY(x)
integer version_major = VERSION_MAJOR;
integer version_minor = VERSION_MINOR;
string revision = STRINGIFY(REVISION);
string version_string = STRINGIFY(VERSION);

ただし、これは に設定version_stringされ"1.0 b"ます。VERSION_MINOR と REVISION の間のスペースを削除したい。私はこれを試しました:

#define VERSION VERSION_MAJOR.VERSION_MINOR##REVISION

しかし、それは生成し"1.VERSION_MINORREVISION"ます。明らかに、これも機能しません:

#define VERSION VERSION_MAJOR.VERSION_MINORREVISION

間にスペースを入れずに 2 つのプリプロセッサ値を連結することは可能ですか?

更新:質問は言語ではなくプリプロセッサに関するものだったため、言語を変更しました。LSL で実際に必要だったのは、最初は C 構文を使用して質問を定式化したにもかかわらずです。これは、より多くのユーザーに馴染みのあるものですが、LSL では、文字列リテラルを隣接させてより長い文字列リテラルを形成することはできません。

4

2 に答える 2

5

さらに掘り下げた後、実際に可能であることがわかりました。その方法は次のとおりです。

#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)

integer version_major = VERSION_MAJOR;
integer version_minor = VERSION_MINOR;
string revision = STRINGIFY(REVISION);
string version_string = STRINGIFY(VERSION);

のようSTRINGIFYに、マクロCONCATを機能させるには 2 つのレベルで定義する必要があります。

出力は次のとおりです。

integer version_major = 1;
integer version_minor = 0;
string revision = "b";
string version_string = "1.0b";

予想通り。

于 2016-11-18T22:05:56.253 に答える
2

C で隣り合う 2 つの文字列は、1 つの文字列として扱われ、自動的に連結されます。したがって、 がある場合"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);
于 2016-11-19T16:47:17.430 に答える