C/C++ スタイルルール

とりあえずのスタイルルール

基本的にはその言語の開発者の流儀に従う。

C は Brian W. Kernighan and Dennis M. Ritchie, The C Programming Language, second edition (Prentice-Hall, 1988) のスタイル(K&R 流)に従う。

C++ も基本的には上と同じでいいが, Bjarne Stroustrup, The C++ Programming Language, third edition (Addison-Wesley, 1997) に従って char *p; ではなく char* p; と書く。 私の CGI で学ぶ C++ のコード例参照。

Java も基本的には上と同じでいいが, Java 独自の部分は Sun から出ている Java の本の流儀に従う。 私の Java 言語について のコード例参照。

インデントは K&R の本にならって4桁ごととする。 TAB コードは使わず,スペースで展開する*

* 『C言語による最新アルゴリズム事典』 のソースコードでは VZ エディタで C を編集したときの既定値で TAB を4桁としたが, 環境によって見え方が違ってしまった。 ちなみに,この本は紙を節約するため詰め込みすぎたところがあるが, これは真似る必要はない。

右側のコメントは33バイト目から始める(これはあまり気にする必要はない)。 33という数字は下の indent や CC mode での既定値。

//345678901234567890123456789012345678901234567890
#include              // 入出力の準備
using namespace std;            // std を使う
int main(int argc, char* argv[]) // メイン
{
    for (int i = 1; i < argc; i++) // 引数を出力
        cout << argv[i] << '\n';
}

indent を使う

GNUindent を次のように使えば C ソースを(ほぼ)上のルールに則って書き直してくれます:

indent -kr -ts255 *.c

-kr は K&R 流,-ts255 は255文字のスペースをTABコードに置き換える (したがって実際にはTABの代わりにスペースを使う) という意味です。

たとえば次のようなコードを処理してみましょう。

int
foo( double x ){
    if( sin( x ) == 0 )
    {
        return 3;
    }
    else
    {
        return 5;
    }
}

indent -kr -ts255 の出力は次のようになります。

int foo(double x)
{
    if (sin(x) == 0) {
        return 3;
    } else {
        return 5;
    }
}

indent は C++ でも簡単な場合は使えますが,完全ではありません。 Java ではさらに悲惨なことになります。

CC mode を使う

XEmacs/Emacs/Mule ではファイルを開くと拡張子で自動的に言語を判断し, 適当な編集モードになります。 インデントのルールを指定しておけば, 自動的にそれに則ってインデントしてくれますので, スタイルをそろえるのに便利です。 最下行に C とか C++ とか Java とか出るはずですので,確認してください。 実際に働いているのは CC mode という emacs lisp プログラムです。

インデントのルールを K&R 流にするには, ホームディレクトリの .emacs に次のように書き加えます:

(require 'cc-mode)

;; Kernighan & Ritchie スタイルにする
(setq c-default-style "k&r")

;; BackSpace キーを「賢く」し,インデント幅は4桁,タブはスペースに展開
(add-hook 'c-mode-common-hook
     	  '(lambda ()
             (progn
               (c-toggle-hungry-state 1)
               (setq c-basic-offset 4 indent-tabs-mode nil))))

;; .hpp と .h を C++ の拡張子とする(.h の方は余計かも)
(setq auto-mode-alist
      (append
       '(("\\.hpp$" . c++-mode)
         ("\\.h$"   . c++-mode)
         ) auto-mode-alist))

これでも望みのモードにならない場合は,たとえば M-x c++-mode のように打ち込みます。 あるいは,ファイルの先頭に -*- C++ -*- を含む文字列を,たとえば

// This is a -*- C++ -*- header.
のように書いておけば,C++ モードになります。

CC mode のよく使う機能をまとめておきます。

(付)CC mode のインストール

最新の CC mode のインストールは次のようにします。

まず CC Mode サイトから最新版をいただいてきて,Emacs 用のディレクトリ(下の例では /usr/local/share/emacs/site-lisp)で展開します。

cd /usr/local/share/emacs/site-lisp
tar xvzf .../cc-mode-5.30.8.tar.gz
ln -s cc-mode-5.30.8 cc-mode

Mule (Emacs 19.34) の場合は cc-make.el

(defconst cc-path-to-the-custom-library
  ;; 中略
  nil
  )
となっているところを
(defconst cc-path-to-the-custom-library
  ;; 中略
  "/usr/local/share/emacs/site-lisp/cc-mode/"
  )
に変えます。さらに, custom というライブラリをいただいてきて, 適当なところで展開して Makefile
EMACS   = emacs
EMACS   = mule
にして make してできた *.elc と念のため *.elcc-mode のディレクトリにコピーします。

そうしてから,

mule -batch -no-site-file -q -l cc-make.el cc-*.el
と打ち込みます。

.emacs に上記のパスを設定しておきます。

(setq load-path (cons "/usr/local/share/emacs/site-lisp/cc-mode" load-path))

奥村晴彦

Last modified: 2004-04-04 09:25:44