3

私はC99で組み込みアプリケーションを開発していますが、プロジェクトには次のように定義された整数定数が含まれています。

#define LEVEL1     0x0000
#define LEVEL2     (LEVEL1 + 1)

その後、ロギングの目的でこれらの値を追跡することが有用になったので、マクロを使用して、上記の評価されたバージョンから文字列リテラルを作成したいと思います。例えば:

strncpy(str, STRING(LEVEL2), len);

理想的には

strncpy(str, "0x0001", len);

あるいは

strncpy(str, "0001", len);

(この質問で示唆されているように)#演算子を使用して2段階のマクロを使用すると、ほとんど機能します。に評価します

strncpy(str, "(LEVEL1 + 1)", len);

ランタイム関数の使用を避けたいので、マクロソリューションを試みます。提案?

4

2 に答える 2

2

プリプロセッサストリンガイザは非常に面倒なので、バージョン番号を作成するときと文字列化するときの両方で、あるレベルの間接参照を追加する必要があります。

#define STRING1(s) #s
#define STRING(s) STRING1(s)

#define LEVEL(x) x
#define LEVEL1 LEVEL(1)
#define LEVEL2 LEVEL(2)

printf(STRING(LEVEL2));
//2
于 2010-07-28T03:36:06.370 に答える
1

プリプロセッサはC言語について何も知らないため、評価できないため、これを行うことはできません。

目的の結果を得るには、次の2つのオプションがあります。

手動評価

表示したいレベルを正確に記述し、単一のストリンガー演算子を使用します。

#define LEVEL1 0x0000
#define LEVEL2 0x0001
#define STRING(x)   # x

strncpy(str, STRING(LEVEL2), len);

欠点は、これがエラーを起こしやすく、ローカルのコーディング規則と衝突する可能性があることです。

ランタイム評価

文字列形式の関数sprintfまたは。のいずれかを使用しますsnprintf

#define LEVEL1 0x0000
#define LEVEL2 0x0001

char level[7];
snprintf(level, sizeof level, "%#06x", LEVEL2);
strncpy(str, level, len);

これには、回避したい実行時のオーバーヘッドがあります。

于 2010-08-05T15:49:18.637 に答える