Skip to content

バンドル出力の重複 #include を後処理で除去するレシピを cheatsheet に載せる #112

Description

@TwoSquirrels

背景

ライブラリを細かいヘッダに分割していると、各ヘッダが自分の使う std ヘッダを個別に #include するため、バンドル出力に kept ライブラリの同一 include 行が多数散らばる。実例として、atcoder-env の分割ライブラリ構成では提出コードの include 行 117 行のうちユニークなのは 61 行だった (<type_traits> ×9、<string> ×8 など)。

2 回目以降の include は include guard により no-op なので実害はなく、どの行を「重複」とみなすかはユーザーのライブラリ構成に依存するため、除去は risundle の責務ではないと考える。

提案

docs/cheatsheet.md (と .ja) に、後処理で重複 include を潰すレシピを追記する:

risundle main.cpp | awk '{ print (/^#include/ && seen[$0]++) ? "" : $0 }' > submission.cpp
  • 同一の #include 行の初出だけを残し、2 回目以降を空行に置換する
  • 行削除ではなく空行置換なのは、出力中の #line ディレクティブと物理行番号の対応を崩さないため (削除すると以降の診断メッセージの行番号がずれる)
  • include guard 済みヘッダの再 include は no-op なので意味論的に安全
  • 制限: 表記が異なるが推移的に包含済みの include (例: <atcoder/all> 包含下の <atcoder/modint>) はテキスト比較では残る

上記ワンライナーは実際のバンドル出力 (438 行) で include 117 行 → 61 行・総行数不変となり、コンパイル・実行とも問題ないことを確認済み。


🤖 この issue は Claude Code により生成されました

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions