HOWTO · C++

C++ での.cc ファイル拡張子と.cpp ファイル拡張子の違い

C++ の .cc と .cpp の選び方、GCC で両方をコンパイルする方法、名前変更時にビルド設定を更新する理由を説明します。

このページの内容

.cc ファイルは C++ のソースファイルです。.cpp も同じ目的で使われ、通常の C++ ソースファイルでは、両者は異なる C++ 言語ではなく命名規則です。既存のプロジェクトやビルドツールで使われている拡張子を使い、新しいプロジェクトではどちらか一方を選んで統一してください。GCC は両方を C++ 入力として認識します。

GCC で両方の拡張子をコンパイルする

次のプログラムを main.cc または main.cpp として保存します。

#include <iostream>
int main() { std::cout << "C++\n"; }

g++ で両方の名前をコンパイルして実行します。

g++ -std=c++23 main.cc -o cc.out && ./cc.out
g++ -std=c++23 main.cpp -o cpp.out && ./cpp.out

どちらも次を出力します。

C++

この結果は Linux 上の g++ (Ubuntu 15.2.0-16ubuntu1) 15.2.0 で確認しました。GCC の全体オプションの文書には、.cc.cpp の両方が C++ ソースの拡張子として記載されています。この例には C++23 対応の GCC/g++ が必要です。プロジェクトが別の言語標準を指定している場合はそれを使います。

拡張子が変えるもの

拡張子は、コンパイラドライバやビルドツールが入力ファイルを分類する手掛かりです。ファイル内のコードを別の種類の C++ に変えるものではありません。.cc.cpp のどちらにも、完全なプログラム、関数、またはヘッダーで宣言したものの実装を置けます。ヘッダーやクラスの使用は、どちらの拡張子にも必須ではありません。

C++ 標準は特定のファイル拡張子を義務付けていません。認識規則はコンパイラドライバとツールが定めるため、OS ごとの一般論より既存リポジトリの規則を優先します。

プロジェクトで .cc.cpp を選ぶ

状況 実用的な選択
リポジトリとビルドファイルがすでに一方を使う その拡張子に従います。
プロジェクト規則が .cc を要求する .cc を使います。たとえば Google C++ Style Guide は C++ ソースに .cc を指定しています。
新規プロジェクトに規則がない .cc または .cpp を選び、一貫して使います。

特定の OS と結び付けられるからといって、どちらかが本質的に移植性に優れるわけではありません。実際に使うコンパイラ、IDE、ビルド設定を確認してください。

通常の C++ ソースに .c を使わない

ここではドライバが重要です。GCC の一般的な拡張子表では .c は C 入力です。一方、g++ ドライバの文書は、-x で言語を上書きしない限り g++.c.h.i を C++ として扱うと説明しています。確認したホストでは、同じ C++ プログラムを main.c と名付けても次のコマンドでコンパイルできました。

g++ -std=c++23 main.c -o c.out && ./c.out

出力は C++ でした。対して gcc -std=c23 main.c -o gcc-c.out は、C ドライバが C として扱い C++ ヘッダー iostream を見つけられないため、このプログラムで失敗しました。

この違いがあるため、通常の C++ ソースを .c と名付けるべきではありません。結果がビルドで呼ばれるドライバに依存するからです。拡張子からの推測を上書きする必要がある場合、GCC は -x c++ を受け付けます。また、Clang CommandGuide は後続入力の言語を指定する -x を文書化しています。MSVC は、指定ファイルを C++ として扱う /Tp を文書化しています。実際のビルド設定は異なることがあります。

名前変更時にビルドを更新する

コードが同じでも、main.ccmain.cpp に変更すると失敗することがあります。CMake、Make ルール、IDE プロジェクトファイル、ファイルグロブ、生成されたビルド入力、スクリプトが古い名前を列挙したり、一方の拡張子だけに一致したりするためです。参照を更新してからプロジェクトを再ビルドし、変更を確認してください。

次の整理手順は、C++ で複数のコードファイルを使う方法を参照してください。