[解決済み] 変数名の中にコメントを書くことはできますか?
質問
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コードコンテスト
関連
-
[解決済み] printf ファミリーを使用して、size_t 変数をポータブルに印刷するにはどうすればよいですか?
-
[解決済み] C++とCの融合 - #ifdef __cplusplus はどのように機能するのか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] C言語とC++の両方で有効なコードを、それぞれの言語でコンパイルすると、異なる動作になることがありますか?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] C言語でオブジェクト指向のコードを書くとしたら、どのようにすればよいのでしょうか?[クローズド]
-
[解決済み] .aファイル、.soファイルとは何ですか?
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
-
[解決済み】なぜアスタリスクは型の後ではなく、変数名の前にあるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
g++が内部・外部コマンドソリューションとして認識されない、MinGWを初めて使うときの落とし穴
-
Cエラー [エラー] 代入_Ashesの左オペランドにlvalueが必要です-プログラマーズ・シークレット
-
VSCodeでCプログラムを書くとエラーになる:ソースファイル "stdio.h" を開くことができない
-
C++の配列コピー
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
警告: 'struct XXX' はパラメータリストの内部で宣言されています。
-
[解決済み] C言語でchar配列をコピーする方法は?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] C言語標準に準拠した構造体の初期化方法
-
[解決済み] フリーは、どのように無料化を知っているのですか?