3

タイプミスを修正し、私が言及するのを忘れていた問題を追加するために、ここにマクロがあります:

#define SUFFIX .new
#define STR(x) #x
#define GENFILE(name,suff) STR(timings/name suff)

GENFILE(test1, SUFFIX)

上記のコードが生成されtimings/test1 .new、その余分なスペースがなかった場合、私は欲しいものを手に入れることができますが、どうすればそれを回避できますか?

4

2 に答える 2

6

簡単:言うだけ#define GENFILE(name) STR(timings/name)です。

スラッシュはプリプロセッサトークンを区切るので、全体として文字列化されたものにGENFILE(test1)なります。STR(timings/test1)

(今、あなたは言うことができます#include GENFILE(myheader)。)


または、と言うこともできますが #define GENFILE(name) STR(timings/) #name、その結果、2つの連結された文字列になります "timings/" "test1"。かなりきれいに注意してください。@hvdが正しく観察しているように、文字列の連結を#includeディレクティブ内で使用することはできません。

于 2012-09-19T13:31:09.000 に答える
4

単一のトークンはありません(必要に応じて「単語」と呼びます)/test1/test1は除算演算子/の後に識別子が続くものtest1であり、これらを一緒に追加することはできません。幸いなことに、あなたはそうする必要はありません。それらが間にスペースなしで一緒に表示され、それを文字列化すると、スペースは挿入されません。したがって、を削除するだけ##です。

また、マクロパラメータ名が定義で使用しているものと一致していることを確認してください。testnamename同じではありません。

#define STR(x) #x
#define FILE(testname) STR(timings/testname)

更新

質問を編集したので、上記は完全な答えではなくなりました。

マクロ定義にスペースを含めたためにスペースを取得し、スペースを含まないようにマクロ定義を書き直す必要があります。これを行う1つの方法は、次のような追加のマクロを使用することです。

#define SUFFIX .new
#define STR(x) STR_(x)
#define STR_(x) #x
#define ID(x) x
#define GENFILE(name,suff) STR(timings/ID(name)suff)
GENFILE(test1, SUFFIX) // expands to "timings/test1.new"

文字列に含める前に展開STRできるように、マクロには追加のヘルパーマクロも必要であることに注意してください。ID

于 2012-09-19T13:31:47.843 に答える