name: cpp-review description: Review C++ code against Google C++ Style Guide. Use when reviewing C++ code, pull requests, or when asked to check code style compliance.
C++ Code Review (Google Style)
Review C++ code for compliance with the Google C++ Style Guide.
Review Checklist
Naming
- Types use
PascalCase - Functions use
PascalCase(accessors usesnake_case) - Variables use
snake_case - Class members have trailing underscore:
member_ - Constants use
kPascalCase - Macros use
UPPER_CASEwith project prefix
Headers
- Has
#defineguard:PROJECT_PATH_FILE_H_ - Self-contained (includes all dependencies)
- Includes ordered: related header, C system, C++ stdlib, other libs, project
- No forward declarations unless necessary
Classes
- Single-argument constructors are
explicit - Data members are
private - Copy/move semantics explicit (= default, = delete)
- No virtual calls in constructors
- Uses composition over inheritance when appropriate
Functions
- Returns values instead of output parameters when possible
- Parameters ordered: inputs before outputs
- Functions are ≤40 lines (prefer smaller)
- Uses
override/finalfor virtual overrides
Modern C++
- Uses
nullptr(notNULLor0) - Uses C++ casts (not C-style)
- Uses range-based for loops where appropriate
- Uses
autoappropriately (not excessively) - Smart pointers for ownership (
unique_ptr,shared_ptr)
Formatting
- 80 character line limit
- 2-space indent
- Braces on same line as control structures
- Spaces around binary operators
Feedback Format
Use severity levels:
- 🔴 MUST FIX: Style violations or bugs that must be fixed
- 🟡 SHOULD FIX: Strong recommendations for improvement
- 🟢 CONSIDER: Optional enhancements or suggestions
Example Review Comment
🔴 **MUST FIX**: Missing `explicit` on single-argument constructor
Line 45: `Foo(int value)` should be `explicit Foo(int value)` to prevent
implicit conversions.
🟡 **SHOULD FIX**: Function too long
Lines 78-145: `ProcessData()` is 67 lines. Consider breaking into smaller
functions for readability and testability.
🟢 **CONSIDER**: Use structured bindings
Line 23: `auto [iter, success] = map.insert({key, value});` would be clearer
than separate `.first` and `.second` access.