コーディングスタイル

命名規則

接頭辞・接尾辞・ハンガリアン記法

接頭辞やハンガリアン記法は採用しない。

クラス名

class CHoge {
};

変数名

class Hoge {
private:
    int m_value;
};
Hoge g_hoge;
class Hoge {
private:
	int value_;
};

接頭辞

bool fCondition;
char *pSomething;

接尾辞

char *dataptr;
std::shared_ptr<Hoge> hoge_ptr;

絶対厳禁

char *lpszText;

インデントと空白と改行

桁揃え

	switch (n) {
	case 1:    return "a";    // comment
	case 12:   return "ab";   // comment
	case 123:  return "abc";  // comment
	}

if

	if (cond1) {
		// do something
	} else if (cond2) {
		// do something
	} else {
		// do something
	}

読みにくい

	if (c != 'a' && c != 'b' && c != 'c') {
		// do something
	}

良い

	if (c == 'a' || c == 'b' || c == 'c') {
		// nop
	} else {
		// do something
	}

while

	while (cond) {
		// do something
	}

do while

	do {
		// do something
	} while (cond);

for

	for (int i = 0; i < 10; i++) {
		// do something
	}

switch

良い

	switch (n) {
case 1: // do something break; }

良くない

	switch (n) {
case 1: // do something break; }

通り抜け

	switch (n) {
case 1: // do something break; case 2: // fallthru case 3: // do something break; }

良い

hoge();

良くない

hoge() ;

良い

int n = (12 + 34);

良くない

int n = ( 12+34 );

良い

bool g = !f;

良くない

bool g = ! f;

カンマ

hoge(a, b, c);

代入

良くない

	while ((c = get()) != 0) {
	}

例外

	if (Hoge *hogeptr = dynamic_cast<Hoge *>(baseptr)) {
	}

変数宣言

良い

char *p;

良くない

char* p;

長い文

良い

	if (!CreateProcessW(0, &tmp[0], 0, 0, TRUE, CREATE_NO_WINDOW, 0, 0, &si, &pi)) {
	}

良くない

	if (!CreateProcessW(0, &tmp[0], 0, 0, TRUE,
						CREATE_NO_WINDOW, 0, 0, &si, &pi)) {
	}

条件式

良い

	bool f;
	if (f) {
	}
	if (!f) {
	}

良くない

	bool f;
	if (f == true) {
	}
	if (f == false) {
	}

厳禁

	bool f;
	if (true == f) {
	}
	if (false == f) {
	}

良い

	char *p;
	if (p) {
	}
	if (!p) {
	}

良くない

	char *p;
	if (p != nullptr) {
	}
	if (p == nullptr) {
	}

厳禁

	char *p;
	if (nullptr != p) {
	}
	if (nullptr == p) {
	}

良い

	int n;
	if (n == 42) {
	}

厳禁

	int n;
	if (42 == n) {
	}

良い

	if (c >= '0' && c <= '9') {
	}

原則避ける

	if ('0' <= c && c <= '9') {
	}

関数

良い

void hoge(int arg1, int arg2, int arg3)
{
}

できるだけ避ける

void hoge(int arg1,
		  int arg2,
		  int arg3)
{
}

厳禁

void
hoge(int arg1, int arg2, int arg3) {
}

要検討

struct HogeArgs {
	int arg1;
	int arg2;
	int arg3;
};
void hoge(HogeArgs *args)
{
}

ポインタ引数

良い

void func(int *v)
{
	*v = 123;
}

厳禁

void func(int &v)
{
	v = 123;
}

良い

void func(Hoge *hoge)
{
}

厳禁

void func(Hoge &hoge)
{
}

良い

void func(Hoge const *hoge)
{
}

良い

void func(Hoge const &hoge)
{
}

const

class Hoge {
	int getValue() const
	{
		return value;
	}
};

名前空間

namespace ns1 {
namespace ns2 {

class Hoge {
};

}} // namespace ns1::ns2

pimplイディオム

クラスが大きくなってきたら、pimplイディオムの採用を検討する。ポインタは m を推奨。

Hoge.h

class Hoge {
private:
	struct Private;
	Private *m;
public:
	Hoge();
	~Hoge();
];

Hoge.cpp

struct Hoge::Private {
};

Hoge::Hoge()
	: m(new Private)
{
}

Hoge::~Hoge()
{
	delete m;
}

クラスメンバ関数内で、pimplイディオム以外の用途で m という変数を使用することを避ける。

ライブラリ