跳到正文
cccskills
免费在 GitHub 公开

include-what-you-use

Use when reducing header bloat and compilation cascades with Include What You Use, interpreting IWYU reports, mapping files, forward declarations, or CMake integration.

中文简介正在准备中。当前显示原文说明。

查看安装方法

包含的文件(2)

  • SKILL.md6.0 KB
  • agents/openai.yaml242 B

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

Include What You Use

IWYU finds #include directives a file does not need and ones it implicitly relies on. Grounded against IWYU 0.26.

Contract

FieldBound contract
TriggerThe task reduces C/C++ header bloat or compilation cascades, runs or interprets IWYU, writes mapping files, decides between forward declarations and full includes, or wires IWYU into a build.
AuthorityReversible local: writes only source files (through fix_include), .imp mapping files, and build configuration; rollback is version control. No remote mutation.
Side effectfix_include edits source files in place; IWYU analysis runs the compiler front end on each translation unit.
DoneThe IWYU report is produced, applied or triaged, and the project still builds and passes its tests.

Inputs

  • A C/C++ project with a compilation database (required): compile_commands.json from CMake, Bear, or compiledb.
  • IWYU installation (required): iwyu/include-what-you-use plus iwyu_tool.py and fix_include from the same package.
  • Mapping files (optional): project or third-party .imp files.

Procedure

  1. Produce a compilation database if none exists. Done when: compile_commands.json covers the files to analyze.
cmake -S . -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
# or for Make-based trees: bear -- make
  1. Run IWYU. Done when: the report covers the intended translation units.
# Single file
iwyu -Xiwyu --error main.cpp 2>&1

# Whole project through the compilation database
iwyu_tool.py -p build/ 2>&1 | tee iwyu.log
  1. Wire IWYU into CMake for continuous checking. Done when: the build emits IWYU advice per translation unit.
find_program(IWYU_PROGRAM NAMES include-what-you-use iwyu)
if(IWYU_PROGRAM)
    set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE
        ${IWYU_PROGRAM}
        -Xiwyu --mapping_file=${CMAKE_SOURCE_DIR}/iwyu.imp
        -Xiwyu --no_comments
    )
endif()
  1. Read the report. should add names headers that provide symbols the file uses but does not include. should remove names headers whose symbols the file does not use directly. The full include-list is the suggested final state. Done when: each add and remove line is classified as correct, wrong, or needing a mapping.
main.cpp should add these lines:
#include <string>          // for std::string
#include "mylib/widget.h"  // for Widget

main.cpp should remove these lines:
- #include <vector>       // lines 5-5

The full include-list for main.cpp:
#include <string>          // for std::string
#include "mylib/widget.h"  // for Widget
---
  1. Apply fixes with fix_include, then rebuild and test before accepting. Done when: the tree builds and tests pass after the edits.
fix_include --dry_run < iwyu.log          # preview only
fix_include < iwyu.log                    # apply
fix_include --nosafe_headers < iwyu.log   # also remove "safe" system headers
fix_include --comments < iwyu.log         # keep the // for-symbol comments
fix_include --only_re='src/.*\.cpp' < iwyu.log   # limit to matching files
  1. Prefer forward declarations in headers when the full type is not needed. Done when: headers that only name a type through a pointer or reference use a forward declaration.
// Forward declaration suffices for:
class Widget;
void process(Widget *w);    // pointer or reference parameters
Widget *make();             // pointer return types

// Full include is required for:
class Mine : public Widget {};   // inheritance
void f() { Widget w; w.size(); } // instances, member access, sizeof
std::vector<Widget> items;       // template instantiation
// IWYU-friendly header: the .cpp pays the include cost, consumers do not
#pragma once
class Widget;

class Container {
    Widget *head_;
public:
    void add(Widget *w);
    Widget *get(int idx);
};
  1. Write mapping files for third-party headers. .imp files are JSON-like and allow # comments and trailing commas. Done when: IWYU stops suggesting private or internal headers.
# iwyu.imp
[
  # Map an internal header to its public entry point
  { "include": ["<bits/types.h>", "private", "<sys/types.h>", "public"] },
  { "include": ["<bits/socket.h>", "private", "<sys/socket.h>", "public"] },

  # Map a symbol to the header that must provide it
  { "symbol": ["std::string", "private", "<string>", "public"] },
]
iwyu -Xiwyu --mapping_file=iwyu.imp main.cpp
# IWYU ships mappings for STL, Boost, and libc++; check the package's
# share directory, e.g. /usr/share/include-what-you-use/
  1. Iterate. IWYU is wrong often enough that blind application breaks builds: macros, template specializations, and headers kept for ODR reasons all confuse it. Run, apply, rebuild, test, revert what breaks, repeat. Done when: the report is clean or the remaining advice is documented as rejected.
# Measure the cascade a header causes before removing it
grep -rl '#include "expensive.h"' src/ | wc -l

Failure and recovery

  • Build breaks after fix_include: revert the file and add a mapping or a // IWYU pragma: keep comment on the include that must stay.
  • IWYU suggests a private header: add an include mapping from the private path to the public one.
  • IWYU removes a header needed for a macro: keep it with // IWYU pragma: keep; macro provenance is a known blind spot.
  • iwyu_tool.py finds no files: the compilation database is missing or empty; regenerate it with CMAKE_EXPORT_COMPILE_COMMANDS=ON.
  • Report is huge: scope with --only_re or run per-directory; fix the most-included headers first, they dominate the cascade.

Output

An IWYU report triaged into applied fixes and documented rejections, a tree that still builds and tests clean, and where useful a project .imp mapping file that stops recurring bad advice.

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

Use when explaining System V AMD64, ARM AAPCS, RISC-V psABI, stack frames, variadic calls, or FFI register rules. Not for the Rust FFI binding layer: use rust-ffi.

中文简介正在准备中。当前显示原文说明。

OutlineDriven/odin-claude-plugin372026年9月29日 更新

Use when configuring ADC sampling time, DMA-driven ADC, calibration, or DAC channel setup on bare-metal MCUs. Not for the DMA stream itself: use dma-baremetal.

中文简介正在准备中。当前显示原文说明。

OutlineDriven/odin-claude-plugin372026年9月29日 更新

af-xdp

免费

Use when creating AF_XDP sockets, configuring UMEM and XSK rings, writing an XDP redirect program, or choosing copy versus zero-copy mode. Not for full kernel bypass: use dpdk.

中文简介正在准备中。当前显示原文说明。

OutlineDriven/odin-claude-plugin372026年9月29日 更新

Use when a completed session needs an agent-environment retrospective. Not for an engineering retrospective from telemetry: use engineering-retrospective.

中文简介正在准备中。当前显示原文说明。

OutlineDriven/odin-claude-plugin372026年9月29日 更新

Use when a redacted, trimmed agent transcript must be appended to a GitHub PR or issue body, with human approval and preview. Not for automated or model-initiated insertion.

中文简介正在准备中。当前显示原文说明。

OutlineDriven/odin-claude-plugin372026年9月29日 更新

agents-md

免费

Use when a repo needs agent setup, AGENTS.md added or made lean, CLAUDE.md audited, or agent instructions scored or pruned. Not for remote, credential, publish, deploy, or irreversible changes.

中文简介正在准备中。当前显示原文说明。

OutlineDriven/odin-claude-plugin372026年9月29日 更新

查看 OutlineDriven 的全部技能

报告此技能的问题