2

InfoPlistファイルを前処理して、リビジョン番号を含めています。私のヘッダーは次のようになります。

#import "svn.h"

#define APP_VERSION 1.0
#define APP_BUILD APP_VERSION.SVN_REVISION

プログラム内からビルドバージョンを確認すると、1.0 . 123456です。しかし、私がこれを試してみると:

#import "svn.h"

#define APP_VERSION 1.0
#define APP_BUILD APP_VERSION ## . ## SVN_REVISION

私は得る

error: pasting formed 'APP_VERSION.', an invalid preprocessing token
error: pasting formed '.SVN_REVISION', an invalid preprocessing token

私はこの質問を見ましたが、実際には答えがありません。OPは実際にトークンを連結する必要はありませんでした。そうです。スペースを挿入せずに、2つのマクロをドットで連結するにはどうすればよいですか?

4

1 に答える 1

6

この問題は、プリプロセッサの癖が原因のようです。連結演算子への引数が最初に展開されていないため(または、ルールが複雑な場合でも)、現在、プリプロセッサは連結1.0を試みていません.。実際には、単語APP_VERSIONを出力トークンに貼り付けようとしています。Cでは単語にドットが含まれていないため、これは単一の有効なトークンではないため、エラーが発生します。

通常、次のように、連結操作が少なくとも2つの置換の背後に隠れるように、ラッパーマクロのいくつかのレイヤーを通過することで問題を強制できます。

#define APP_VERSION 1.0
#define SVN_REVISION 123456

#define M_CONC(A, B) M_CONC_(A, B)
#define M_CONC_(A, B) A##B

#define APP_BUILD M_CONC(APP_VERSION, M_CONC(.,SVN_REVISION))

APP_BUILD    // Expands to the single token 1.0.123456

幸運なことに、Cのfloat定数にはドットが1つしかない場合でも、Cプリプロセッサ番号にはドットをいくつでも含めることができます。

于 2013-02-10T23:45:47.840 に答える