Closed. This question is
opinion-based。它当前不接受答案。
想改善这个问题吗?更新问题,以便
editing this post用事实和引用来回答。
7年前关闭。
Improve this question
不确定我的问题是否适合StackOverflow问题的所有规则,但我认为这将对将来的用户有所帮助。
现在,我需要为我参与的一些C++项目选择编码风格。这些项目足够大,每个项目都会有一些程序员在工作。因此,我们需要均衡我们的代码样式。另外,我们希望选择一种社会上可以接受的编码样式,因此首先,我将告诉我们我们已经决定要拥有的样式。我的问题是,我们的某些选择是否在社会上不被接受,还有其他一些通常使用C++编码样式规则的选择。
所以我们在这里选择了什么:
文件命名
以大写字母开头,每个新单词都有一个大写字母(没有下划线,没有空格)。
例如:
VeryImportantClass.h
VeryImportantClass.cpp
命名空间命名
以大写字母开头,每个新单词都有一个大写字母(没有下划线,没有空格)。对齐也应适当。
例如:
namespace Drinks
{
namespace AlcoholDrinks
{
}
}
命名空间结构
在头文件中,只有函数/方法原型(prototype),可以在
cpp
文件中实现,请避免将
using namespace
用于实现文件。
例:
//header
namespace CommonStuff
{
namespace SystemParameters
{
bool IfWindows();
//some more stuff...
}
}
//cpp file
namespace CommonStuff
{
namespace SystemParameters
{
bool IfWindows()
{
//some stuff...
return ...;
}
}
}
类和结构的命名
以大写字母开头,每个新单词都有一个大写字母(没有下划线,没有空格)。没有C之类的前缀或S之类的结构前缀。我们决定-它只是要输入更多内容。
例:
class MyClass
{
};
struct MyStruct
{
};
类或结构
在某些情况下,很难理解我们是否需要类或结构。如果结构仅保留一些分组的数据,则为
struct
。如果结构保留数据并具有方法,则为
class
。异常方法是构造函数,析构函数和比较运算符。
例:
class MyClass
{
public:
MyClass();
~MyClass();
void SetValue(int value);
int GetValue();
void PrintValue();
private:
int m_value;
};
struct MyStruct
{
MyStruct();
~MyStruct();
int value;
};
类型名称
以大写字母开头,每个新单词都有一个大写字母(没有下划线)。
例如:
typedef std::string String;
typedef std::vector<String> StringVector;
变量类型
使用我们自己的预定义类型,我们有:
typedef std::string String;
typedef std::vector<String> StringVector;
typedef unsigned char Byte;
typedef std::vector<Byte> ByteVector;
//etc.
变量命名
以小写字母开头,每个新单词都有一个大写字母(没有下划线)。
例:
String messageLicenseExpired = "Your product version is expired, please...";
int importantNumber = 13;
类变量命名
以前缀
m_ 开头,然后单词以小写字母开头,每个新单词都有一个大写字母(无下划线)。
例:
int m_myVariable;
int m_otherVariable;
常数
所有大写字母都带有下划线。
例:
const String PRODUCT_NAME = "our product";
const Byte IMPORTANT_NUMBER = 13;
常数或预处理器
如果将使用
#ifdef
或其他一些值来检查值,则该值必须是预处理程序定义。否则为
const
。
例如:
#define FAILURE_FACTOR_FOR_DEBUG 50
const int MAGIC_NUMBER = 5;
//some code...
String newString = someString.substr(MAGIC_NUMBER);
//some code...
//not the best example, but I think it is understandable.
#ifdef _DEBUG
int someValue = FAILURE_FACTOR_FOR_DEBUG;
#else
int someValue = 0;
#end
功能和方法命名
以大写字母开头,每个新单词都有一个大写字母(没有下划线)。
例如:
int CalculateSometing (int n);
void ToUpper (String& someStr);
大括号
除初始化外,大括号应始终换行。
例:
int arr[] = {1, 2, 3};
if (arr[0] > 10)
{
//do something
}
else
{
//do something else
}
其他
else
属于换行符,请参见前面的示例。
if语句和花括号
即使是
if
或
else
之后的单个代码行也应包含在内。
例:
if (someInt > 100)
{
someInt = 100;
}
else
{
someInt /= 2;
}
方法调用
箭头和点周围没有空格。
例:
Object obj;
Object* oPtr = new Object();
obj.Method();
obj->Method();
头文件
使用#pragma once
代替定义防护。 (#pragma once
不是标准的,因此在某些编译器中必须定义防护措施)仅一类的 header 。 头文件仅用于定义。执行指令必须在相关的cpp
文件中,即使它是getter或setter也是如此。这是因为头文件的更改导致需要长时间编译。 指针和引用
如果可能,请使用引用而不是指针。如果可能,将参数作为引用传递给对象(对于对象),则在不更改值的情况下,最好将其作为
const
引用传递。
例:
String ToUpper(String str); //bad
String ToUpper(String& str); //better
String ToUpper(const String& str); //best
void ToUpper(String& str); //also solution
错误处理
如果函数可能失败,则必须返回
bool
值
true
表示成功,而
false
表示失败。对于类方法,必须使用
GetLastError()
。对于可能失败的功能,应通过附加参数返回错误代码,例如
bool Function(int param, int* errorCode = NULL)
我们还决定在代码中不使用异常。
类结构
在头文件中,第一个公共(public)方法(位于它们顶部的构造函数和析构函数), protected 方法, protected 变量,私有(private)方法,私有(private)变量。没有公共(public)变量,请使用getter和setter。
例:
class MyClass
{
public:
MyClass();
~MyClass();
int GetPrivateValue();
void SetPrivateValue(int value);
int GetProtectedValue();
void SetProtectedValue(int value);
protected:
void SomeMethod();
int m_protectedValue;
private:
void SomePrivateMethod();
int m_privateValue;
};
格式化
对齐方式使用4个空格或制表符。 长行换行,不再有120个符号的行。 自我记录代码
总是欢迎使用注释,但最好的选择是为变量和函数命名,以解释所有内容。
例:
void Function (const String& str, const String& str2, StringVector& vect); //very bad
//This functions tokenize string, str is input string, str2 is delimiters string, vect output
void Function (const String& str, const String& str2, StringVector& vect); //quite bad
void Tokenize (const String& inputString, const String& delimiters, StringVector& output); //good, anyway comments using this declaration also welcome.
&和*位置
在变量类型之后立即编写
&
和
*
。
例:
String* strPtr;
String& strRef;
这是我们决定使用的所有东西,问题是,我们是否错过了某些东西?另外,在全局范围内有什么 Not Acceptable 吗?
随意发表评论并询问是否不清楚,为什么我们选择了一些。
希望对以后的读者有所帮助。