エニュメレーションを一貫して行うにはどうしたらいいですか? - ページ 6

 
pavlick_:

プログラマーへの注意点


これで、列挙を編集する必要がある場合、一度に一箇所で編集できるようになりました。新しい要素を追加する必要があります。例えば、element_new = 56の場合、次のように追加します。

また、関数 get_enumqq_array() をわざわざ編集する必要はない。その手法は「Xマクロ https://en.wikipedia.org/wiki/X_Macro 」と呼ばれています。開発者が望めば、同様の方法で標準的な列挙型を簡単に変更することができる。

すぐにはわからないかもしれないが、列挙するとこのようになった。

カッコイイ!X Macroは知りませんでした!ありがとうございます。ENUM_QQ_HELPERの定義の最後にコンマがあるため、なぜエラーが発生しないのか、このコードが理解できません。enumやarrayを定義する場合、最後の要素の後にカンマがあってはならない。しかし、コンパイラはなぜか悪態をつかないようです。

を試してみました。

int a[] = {1, 2,};

それはないでしょう。そして、配列サイズ(enum)はその通りです。かっこいいですねー。バグらしいのですが、むしろこんなバグがあってもいいのでは?本当に、便利です。

 
コンマによるエラーが発生しない理由

まあ、特にこういういろいろな「もの」については、正当な違反行為らしい。C/C++でもエラーにならないので、心配しないでください。

SZZ:初期化というテーマでC++標準に。

braced-init-list:

   {initializer-list , opt}

   { }

すなわち、braced-init-listの最後のコンマは、最高レベルで合法化されている。

 
pavlick_:

つまり、braced-init-listの最後のカンマは、最高レベルで合法化されているのである。

ありがとうございます!知って使いたいと思います。
 
pavlick_:

プログラマーへの注意点

コメントにあるような普通の名前はどうなんだろう?

 
Комбинатор:

コメントにあるような普通の名前はどうなんだろう?

問題のenumの例を教えてください。
 
Комбинатор:

コメントにあるような普通の名前はどうなんだろう?

はい、コメントの挿入がうまくいきません。列挙型のコメントには不都合な構文があります。

問題のenumの例を教えてください。

enum E
{
   a = 1         // вот этот комментарий
}
 
pavlick_:

はい、コメントの挿入がうまくいきません。列挙のコメントに関する残念な構文。

最後に/*...*/で締めくくります。
 
fxsaber:
/*...*/で結んでください。
プリプロセッサーがコメント(//と/*の両方)を食べたがらず、マクロを展開するときにそれらを見ることを期待していないことがここでのナンセンスです。 プリプロセッサーに関するルールを変更するか、次のような列挙をコメントする代替方法(設定でのスクリプト実行時にコメントが表示される)を導入してください。

enum E {
   a = 1,            --**--  Комментарий_1
   b = 2            --**--  Комментарий_2
};
私はここですでに無力なのだ。
 
pavlick_:
プリプロセッサはコメント(//と/*の両方)を食べたがらないので、マクロが展開されるときにコメントが表示されることを期待していません。 プリプロセッサのルールを変更するか、次のように列挙型のコメント(設定でスクリプトを実行するとコメントが表示されます)に代わる方法を導入してください。

enum E {
   a = 1,            --**--  Комментарий_1
   b = 2            --**--  Комментарий_2
};
私はここですでに無力なのだ。
 

前処理はいくつかのステップで行われます。まず、ソースコードからすべてのコメントを削除し、その結果を送信して処理します。そして、ここはプリプロセッサがコメントに遭遇することを予期していない場所です(マクロを開くとき)。そのような出会いをエラーとみなします。例えば、ここ。

#define  COMMENT / ## /

void OnStart()
{
  COMMENT
}
一見すると、この無害なコードにはコメントが含まれているはずです。でも、コンパイルできない。