1

DDのために何をすべきですか?

もしも

#define HEADING_TITLE_PROJECT_NAME  "<= Version Maintenance Based On Compiled DateTime =>"
#define SIZE_OF_HEADER_FOR_DECORATION_PURPOSE sizeof(HEADING_TITLE_PROJECT_NAME)
#define DD ????
#define HEADING "\r\n"DD"\r\n"HEADING_TITLE_PROJECT_NAME"\r\n"DD"\r\n"

次のようにHEADING文字列リテラルを取得したい:

<==================================================>
<= Version Maintenance Based On Compiled DateTime =>
<==================================================>

=記号または私が一度入れたものはすべて<==...==>内で繰り返され、HEADING_TITLE_PROJECT_NAMEスペースを埋めます。

この方法または他の方法で行うことができますか。 コーディング時にHEADING_TITLE_PROJECT_NAMEを変更したいだけで、他には何も変更しません。 それができるかどうかだけ考えてください:)

<==編集開始==>次のようなもの

#define DD\
 char * get()\
{\
    char arr[100] = '\0';\
    for (int i=0; i < SIZE_OF_HEADER_FOR_DECORATION_PURPOSE - 1; i++)\
    {\
        arr[i] = "=";\
    }\  
    return arr;\
}

<==編集終了==>

4

3 に答える 3

3

残念ながら、マクロDDの定義で使用する方法で使用する限り、標準の C プリプロセッサで自動的に生成する方法はありません。HEADING

現在定義されている方法で定義することを主張する限りHEADING、半自動アプローチの使用のみを提案できます:)。DD手動で明示的に定義します。

#define HEADING_TITLE_PROJECT_NAME "<= Version Maintenance Based On Compiled DateTime =>"
#define DD                         "<==================================================>"

そして、追加するだけです

STATIC_ASSERT(sizeof HEADING_TITLE_PROJECT_NAME == sizeof DD);

そのすぐ下(お気に入りの の実装STATIC_ASSERT)。そうすれば、 の長さに不一致がDDあるとすぐにエラーが発生し、開発者はDD.

于 2011-08-26T17:12:11.810 に答える
0

sizeof はプリプロセッサの前ではなく後で評価されるため、これは不可能です。

紐の長さがあらかじめわかっていれば、そうなります。

プロプロセッサにはループ構造がないため、それらを作成することになります。ブーストはこのようなことをします

#define REPEAT_TIMES(macro, n) REPEAT##n(macro)
#define REPEAT1(macro) MACRO
#define REPEAT2(macro) REPEAT1(macro)MACRO
#define REPEAT3(macro) REPEAT2(macro)MACRO
....

次に、単純に次のようにします。

#define FILLER "="
#define DD "<"REPEAT_TIMES(FILLER, 34)">"
于 2011-08-27T00:30:06.077 に答える
-1

の実装はDD悪い考えではありませんが、構文が貧弱で未定義の動作に悩まされています。

const char *DDD(void)
{
    static char arr[] = HEADING_TITLE_PROJECT_NAME;
    if(arr[2] == ' ')
        for(size_t i = 2; i + 3 < sizeof arr; i++)
            arr[i] = '=';
    return arr;
}
#define DD DDD()

スタックデータへのポインタを返すことはできないため、static配列を使用する必要があります。自動的に#defined文字列に設定し、'='まだ入力されているかどうかを確認し、入力されていない場合は入力することで、適切なサイズであることを確認できます。const次に、誰もそれを変更しようとしないように、そのポインタを返します。

マクロは、引数が指定されていない関数を定義し、データをスタックするgetために変更可能なものを返します。char *残念ながら、この関数はマクロを使用するすべての場所で定義されるため、複数の定義エラーが発生します。

これを生の文字列連結で使用することはできませんが、他のすべての目的で機能します。

于 2011-08-26T17:43:47.867 に答える