<!-- go/cmark -->
<!--* freshness: {owner: 'danilchap' reviewed: '2021-05-12'} *-->

# `.h` and `.cc` files come in pairs

This is an overflow page for [this](/g3doc/style-guide.md#h-cc-pairs)
style rule.

## Example violations

Example violations, which should be avoided in new code:

* Declarations in `path/to/include/foo.h`, definitions in
  `path/to/source/foo.cc`. **Fix:** The `.h` and `.cc` files should be
  in the same directory.
* Declarations in `foo.h`, definitions in both `foo_bar.cc` and
  `foo_baz.cc`. **Fix:** The `.h` and `.cc` files should come in
  pairs, so either split `foo.h` into `foo_bar.h` and `foo_baz.h`, or
  merge `foo_bar.cc` and `foo_baz.cc` into `foo.cc`.

## Exception for platform-specific code

If the functions in a header file need different implementations for
different platforms, we allow the following arrangement:

* Declarations in `foo.h`.
* A complete set of matching definitions in `foo_win.cc`, another
  complete set of matching definitions in `foo_mac.cc`, and so on.
* As per the main rule, these files should all be in the same
  directory and in the same build target. The build target should use
  platform conditionals to ensure that exactly one of the `.cc` files
  are included.
