コンパクトな C++ スニペットを読みやすいレイアウトに整形し、ハイライトされた出力をコピーできます。
ブラウザ内でローカルに実行C++ のコードを貼り付けると、フォーマッターが体裁を組み直します。セミコロンごとに 1 文 1 行、波かっこは独立した行、ネストごとにタブ 1 つ、空行は削除されます。ブラウザー内で動くテキストの書き換え処理で、貼り付けた内容が送信されることはありません。
変更されるのは空白だけです。トークン、文字列、コメント、プリプロセッサ行はそのままコピーされるため、出力はコンパイル可能なままです。たとえば #define SWAP(a,b) do { … } while(0) のようなマクロは 1 つの論理行に留まり、C++11 の生文字列 R"(…)" は引用符とかっこを保ちます。
変わるのはトークン間の空白だけです。文を終えるセミコロンの後に改行が入り、波かっこは独自の行に開閉し、インデントはタブで組み直されます。連続する空行は削除されます。長い行の折り返しは行わず、トークンの改名・並べ替え・削除もありません。
プリプロセッサ行は論理行の終わりまで 1 バイトも変えずにコピーされます(末尾のバックスラッシュによる継続を含む)。そのため複数行マクロも壊れません。#define の中に改行が挿入されることはなく、#if / #endif ブロックは構造を保ち、閉じかっこの後ろのディレクティブは行頭に残ります。
// から行末までと、/* … */ の複数行という 2 種類のコメントはそのまま残ります。コメント内のかっこや引用符も同様です。通常の文字列と文字リテラルは書かれたままなので、エスケープされた引用符や文字列内のセミコロンが周囲のコードの体裁を変えることはありません。
C++11 の生文字列 — R"(…)" や、R"xx(… )xx" のような区切り文字付き — はそのままコピーされるため、中の引用符・波かっこ・セミコロンがコードと誤解されることはありません。std::vector<std::pair<int, std::string>> のようなテンプレート構文にも手を付けません。タブ化処理は山かっこを解釈しないためです。
ページの裏側に C++ のパーサーはなく、構文の検証も修復もしません。閉じ忘れやかっこの欠落はエラーにならず、インデントだけが変わって返ります。インデント幅・かっこの位置・行の長さは固定です(タブ 1 つ、かっこは独立行、折り返しなし)。Google や LLVM のようなプロジェクト規約には clang-format を使ってください。
結果は highlight.js の C/C++ 文法でハイライトされます。120 KB を超える入力ではページの応答性を保つためハイライトされません。コードのコンパイルや実行は行わず、ページを読み込んだ後はオフラインでも動作します。