1. ホーム
  2. c

[解決済み] 変数名の中にコメントを書くことはできますか?

2022-05-02 13:51:12

質問

int main()
{
     i/*nt*/a = 10;
     return 0;
}

上記のコードがあり、トークンをカウントしたい場合、14トークンか13トークンになるのでしょうか?

変数名の中にコメントを書くのは有効ですか?を想定しています。 int i , int a , int ia はグローバルに定義されている。

解決方法は?

プログラム翻訳のフェーズ 3 でコメントが削除されます。 1 : は、各コメントをスペース1文字で置き換えます。 ということで、コメント /*nt*/ は間違いなくトークンではありません。

もし int , main , i , a または return が前処理用マクロとして定義されている場合、プログラムをパースすると 14 トークンです(13ではありません)。

int main ( ) { i a = 10 ; return 0 ; }

ただし i を持つ型として定義されています。 typedef ステートメントを使用する場合、次のような構文エラーが発生します。 i a はC言語の文法規則にマッチしない。

そのため、コメントを書くことはできません。 内部 という変数名では、コメントによって識別子が2つの別々のトークンに分割されてしまいます。これはあらゆる前処理とC言語のトークンに当てはまります。 2 .

ただし、単項演算子とオペランドの間、あるいは、オペランドとオペランドの間のような特殊な場所にコメントを挿入することができます。 # およびプリプロセッシングディレクティブとその引数です。

/**/#/**/include/**/<stdio.h>/**///////////////////////
/**/#/**/define/**/STAT/**/(/**/a/**/)/**/-/**/1/**////
/**/#/**/ifdef/**/STAT/**//////////////////////////////
/**/int/**/main/**/(/**/)/**/{/**//////////////////////
/**/int/**/a/**/=/**/+/**/1/**/;/**////////////////////
/**/printf/**/(/**/"Hello "/**/"world!\n"/**/)/**/;/**/
/**/return/**/STAT/**/;/**/////////////////////////////
/**/}/**///////////////////////////////////////////////
/**/#/**/endif/**//////////////////////////////////////

しかし、上記のマクロ定義は、関数のようなマクロではなく、通常のマクロを定義しています STAT に展開されます。 ( a ) - 1 .

変数名は、他のトークンと同様に、エスケープされた改行で分割することができます。エスケープされたニューラインは、シーケンスまたは \ の直後に改行が入ります。これらのシーケンスは、プログラム翻訳のフェーズ2でソースコードから削除されます。主な目的は、複数行に渡る長いマクロ定義を分割することです。

以下はコードの一部です。 3 は、同じ14個のトークンを生成します。

\
i\
nt\
 ma\
in()
{\
i/\
*nt\
*/a \
= 10;
r\
et\
urn\
 0;}


コードカラーライザーが、切り刻まれたキーワードとコメントを見逃していることに注意してください :)


<サブ 1) この動作はANSI-C、別名C89で規定されたものです。古代のコンパイラの中には、トークン・ペーストを引き起こす微妙に異なる動作をするものがありましたが、そのような特殊性は歴史的な興味に過ぎません。

<サブ 2) プログラム翻訳のフェーズ6で、隣接する文字列定数が連結されることを利用すれば、文字列定数の内部にコメントを挿入することがほぼ可能です。 printf("Hello "/* my name is Luca */"world!\n");

<サブ 3)この クリスマスツリー プレゼンテーションのスタイルは、実際のプログラムで使用することを意図したものではなく、Cの入力処理機能を悪用する方法を説明したものです。もっと手の込んだトリックが勝っている 国際難読化Cコードコンテスト