5

これを行う方法が必要です...

1行のヘッダーファイルversion.hがあります...

#define VERSION 9

いくつかのファイルは、VERSIONの定義された値を整数として使用します。それはいいです。

VERSIONの定義方法を変更せずに、その値を含む初期化された「what」文字列を作成する必要があるため、次のようなものが必要です...

char *whatversion = "@(#)VERSION: " VERSION;

明らかにこれはコンパイルされないので、どういうわけか私はこれを本質的に与えるVERSIONの前処理された値の文字列を取得する必要があります...

char *whatversion = "@(#)VERSION: " "9";

何か案は?これは可能ですか?

4

2 に答える 2

5

これはデータ型ではなく、トークンです。テキストの塊。

K & R値の連結について話します。

 The preprocessor operator ## provides a way to concatenate actual arguments
 during macro expansion. If a parameter in the replacement text is adjacent
 to a ##, the parameter is replaced by the actual argument, the ## and
 surrounding white space are removed, and the result is re-scanned. For example,
 the macro paste concatenates its two arguments:

    #define paste(front, back) front ## back

    so paste(name, 1) creates the token name1.

-試してみてください。#到達する前に文字列を定義するchar *version=

于 2013-03-05T22:19:12.283 に答える
0

マクロ内では、「stringify」演算子(#)を使用できます。これにより、必要な処理が正確に実行されます。

#define STR2(x) #x
#define STR(x) STR2(x)
#define STRING_VERSION STR(VERSION)

#define VERSION 9

#include <stdio>
int main() {
  printf("VERSION = %02d\n", VERSION);
  printf("%s", "@(#)VERSION: " STRING_VERSION "\n");
  return 0;
}

はい、マクロ呼び出しで二重間接参照が必要です。それがなければ、"VERSION"代わりに取得します"9"

これについて詳しくは、gccマニュアルを参照してください(完全に標準のC / C ++ですが)。

于 2013-03-06T00:11:18.090 に答える