2017-08-23 11 views
1

私は定義3つの定義タイプを連結するにはどうすればいいですか?string + number + string?

#define LOG_FLOAT_MARKER "%s%d.%010d" 

を使用して次の文字列をconstrunctしたいと思いますこれまでのところ、私はこの

#define LOG_FLOAT_MARKER LOG_FLOAT EXP D 

のような文字列を作成しようとしているが、得ていないのです

#define EXP (10) 
    #define LOG_FLOAT "%s%d.%0" 
    #define D "d" 

持っています期待される出力、いくつかのヒント?

+0

*文字列のみ連結できます。 '(10)'は文字列ではありません。次にマクロに問題があるときは、前処理した後にコンパイラに指示して、マクロをどのように展開したのかを確認してください。 –

+0

@Someprogrammerdudeありがとう、 '#define EXP 10'を使って文字列を作ることができますが、数字用に定義することはできません。 – ndarkness

+0

あなたはおそらく '*'指定子を探しています[http://en.cppreference.com/w/cpp/io/c/fprintf](http://en.cppreference.com/w/cpp/io/c/fprintf)。 – ZDF

答えて

4

EXPには(10)を含めることはできません。括弧を結果の一部にしたくないからです。

あなたは文字列化、およびいくつかのフープジャンプを使用する必要があります。

#define EXP 10 

#define JOIN(a, b, c)  a #b c 
#define JOIN2(a, b, c)  JOIN(a, b, c) 
#define LOG_FLOAT_MARKER JOIN2(LOG_FLOAT, EXP, D) 

はまた、私はちょうどDがトラブルを求めているという名前のプリプロセッサシンボルを使用したと思います。

+0

ありがとう@unwind、最後のステップ '#define LOG_FLOAT_MARKER JOIN2(LOG_FLOAT、EXP、" d ")'が良いでしょうか? – ndarkness

+1

@ndarkness確かに、あるいは 'D'の名前を別のものに変更するか、単にハードコーディングしてください。 – unwind

+0

こんにちは@unwind、 'LOG_FLOAT_MARKER'を印刷すると動作しないようです。'%s%d。%0(10)d'の代わりに '%s%d。%010d' – ndarkness

1

私はあなたがしたいことを理解しているかどうかはわかりません。おそらく*指定子を探しています:

printf("%s%d.%0*d", "string", 1, 1, 1); // output: string1.1 
printf("%s%d.%0*d", "string", 1, 2, 2); // output: string1.02 
printf("%s%d.%0*d", "string", 1, 3, 3); // output: string1.003 

*の完全な説明についてはthisを参照してください。

+0

@ ZDFに感謝しますが、私はprintfを最適化の問題に使用したくありません – ndarkness

関連する問題