0

通ってください。

#define _VERSION_ 1.4
#define DEFAULT_NETWORK_TOKEN_KEY { 3, 6, 5, 100}

// 上記のマクロは変更できませんが、以下のマクロは変更できません

#define STR_VALUE(arg)      #arg
#define FUNCTION_NAME(name) STR_VALUE(name\r)
#define TEST_FUNC      #AP started v _VERSION_
#define TEST_FUNC_NAME FUNCTION_NAME(TEST_FUNC)

#define QUOTE_X(t)#t
#define QUOTE(t)QUOTE_X(t)
#define ABC 100 //{ 3, 6, 5, 100}
#define MYSTR "The value of ABC is"     

const uint8 startMsg[] =  MYSTR " " QUOTE(ABC);

結果: ABC の値は 100 です

const uint8 startMsg[] =  TEST_FUNC_NAME;

results: #AP started v 1.4 (Carriage return) // v と 1.4 の間のスペースも削除したい

私が欲しい

const uint8 startMsg[] = ?? ;

#AP started [3.6.5.100] v1.4 (キャリッジ リターン) または#AP started [3,6,5,100] v1.4 (キャリッジ リターン) などの結果が 必要です。

私は SOC チップに取り組んでおり、スタートアップでこれを示す必要があります。急。:)

------ 質問の答えは ------

#define NETTOKENKEY(a,b,c,d)  "[" #a "." #b "." #c "." #d "]"
#define GENNETTOKENKEY(z)    NETTOKENKEY(z) 

#define STRINGIZER(arg)     #arg
#define STR_VALUE(arg)      STRINGIZER(arg)
#define AP_VERSION_STR      "#AP started v" STR_VALUE(_VERSION_)



#define AP_NETVERSION_STR   "#AP started " \
                            GENNETTOKENKEY(DEFAULT_NETWORK_TOKEN_KEY_VALUES) \
                            " v" STR_VALUE(_VERSION_) **"\r"**

const uint8 startMsg[] = AP_NETVERSION_STR ;
4

4 に答える 4

2

Cプリプロセッサはかなり単純なテキスト置換プログラムであり、マクロを変更することが絶対に不可能な場合、必要なことを実行してコンパイル時の定数文字列を生成することはできないと思います.DEFAULT_NETWORK_TOKEN_KEY

「配列」表記の変換は特に困難です。実際、配列定義マクロを変更しないという前提条件は、おそらくそれが不可能であることを意味します。

新しいマクロを定義DEFAULT_NETWORK_TOKEN_KEYし、それがいつもと同じ値を生成するように再定義することが可能であれば、望む結果を得ることができます。

説明のために、次のように記述できることに注意してください。

#define x             { 3, 45, 5, 49}
#define f4(a,b,c,d)   #a " - " #b ":" #c "/" #d
#define y(z)          f4(z)

y(x)

前処理すると、次のものが生成されます。

"{ 3" " - " "45" ":" "5" "/" "49}"

中括弧は引数文字列の一部であることに注意してください。今、あなたができるなら:

#define DEFAULT_NETWORK_TOKEN_KEY_VALUES 3, 6, 5, 100
#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_VALUES}

(実際には必要ではないと思いますが、非対称の間隔を維持している場合)、次を使用できます。

#define NETTOKENKEY(a,b,c,d)  "[" #a "." #b "." #c "." #d "]"
#define GENNETTOKENKEY(z)    NETTOKENKEY(z)

GENNETTOKENKEY(DEFAULT_NETWORK_TOKEN_KEY_VALUES)

文字列「[3.6.5.100]」を取得します(私の例の値)。

vと の間のスペースを取り除くの1.4は比較的簡単です。

#define STRINGIZER(arg)     #arg
#define STR_VALUE(arg)      STRINGIZER(arg)
#define AP_VERSION_STR      "#AP started v" STR_VALUE(_VERSION_)

AP_VERSION_STR

これらを組み合わせると、次のようになります。

#define AP_NETVERSION_STR   "#AP started " \
                            GENNETTOKENKEY(DEFAULT_NETWORK_TOKEN_KEY_VALUES) \
                            " v" STR_VALUE(_VERSION_)

static const char version[] = AP_NETVERSION_STR;

最後にが必要な場合は、AP_NETVERSION_STR マクロ定義の最後'\r'に追加します。"\r"文字列連結はとても便利です!

しかし、これは の定義を「変更」できることを前提としているDEFAULT_NETWORK_TOKEN_KEYため、このようにフォーマットすることができます。その変化がなければ、それはできないと思います。


テストは必要です!

#define _VERSION_ 1.4
#define DEFAULT_NETWORK_TOKEN_KEY_VALUES 3, 6, 5, 100
#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_VALUES}

#define NETTOKENKEY(a,b,c,d)  "[" #a "." #b "." #c "." #d "]"
#define GENNETTOKENKEY(z)    NETTOKENKEY(z)

GENNETTOKENKEY(DEFAULT_NETWORK_TOKEN_KEY_VALUES)

#define STRINGIZER(arg)     #arg
#define STR_VALUE(arg)      STRINGIZER(arg)
#define AP_VERSION_STR      "#AP started v" STR_VALUE(_VERSION_)

AP_VERSION_STR

#define AP_NETVERSION_STR   "#AP started " \
                            GENNETTOKENKEY(DEFAULT_NETWORK_TOKEN_KEY_VALUES) \
                            " v" STR_VALUE(_VERSION_)

AP_NETVERSION_STR

を実行するgcc -Eと、穏やかにサニタイズされた出力 (空白行と#lineコントロールが削除された) が必要になります。

"[" "3" "." "6" "." "5" "." "100" "]"

"#AP started v" "1.4"

"#AP started " "[" "3" "." "6" "." "5" "." "100" "]" " v" "1.4"
于 2012-07-27T15:04:23.473 に答える
1

Boost.Preprocessorによって提供されるプリプロセッサデータ構造を使用することをお勧めします。そこにあるすべてのマクロは、標準のC89で機能します。

于 2012-07-27T14:49:27.420 に答える
1

マクロを使用する理由:

uint arr[] = DEFAULT_NETWORK_TOKEN_KEY;
float v = VERSION;

sprintf(buffer, "#AP started [%u.%u.%u.%u] v%f", arr[0], arr[1], arr[2], arr[3], v); 
于 2012-07-27T14:52:44.967 に答える
1

C プリプロセッサの # と ## について読んでください。あなたはかなり簡単なものの周りにたくさんのラッパーを置いています

http://gcc.gnu.org/onlinedocs/cpp/Stringification.html

ところで、知る限り、プリプロセッサを使用して {} を [] に変換することはできません

于 2012-07-27T14:59:28.497 に答える