c++编码风格
C++ coding style
不确定我的问题是否符合StackOverflow问题的所有规则,但我认为它将对未来的用户有帮助。
现在我需要为我参与的几个c++项目选择编码风格。这些项目足够大,每个项目都会有几个程序员。所以我们需要平衡我们的代码风格。此外,我们想要选择的编码风格是社会可接受的,所以首先我会告诉我们已经决定有什么。我的问题是,如果我们的一些选择不是社会不接受以及其他常用的c++编码风格规则。
这里是我们选择的
<标题>文件命名以大写字母开头,每个新单词都要大写(没有下划线,没有空格)。
例如:
VeryImportantClass.h
VeryImportantClass.cpp
<标题>名称空间命名h1> 大写字母开头,每个新单词都要大写(没有下划线,没有空格)。还有,对齐也要合适。 例如:
namespace Drinks
{
namespace AlcoholDrinks
{
}
}
<标题>名称空间结构头文件中只有函数/方法原型,在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
{
};
类或结构
在某些情况下,很难理解我们是需要class还是struct。如果结构只是保持一些分组数据-它是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.
<标题>变量命名h1> 小写字母开头,每个新单词用大写字母开头(不能有下划线)。
的例子:
String messageLicenseExpired = "Your product version is expired, please...";
int importantNumber = 13;
类变量命名
以前缀m_开头然后单词以一个小写字母开头,每个新单词有一个大写字母(没有下划线)。
的例子:
int m_myVariable;
int m_otherVariable;
<标题>常量h1> 有字母都要大写并加下划线。标题>的例子:
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);
<标题>括号h1> 了初始化 外,大括号应该总是放在新行中。的例子:
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
不是标准的,所以在一些编译器定义的保护是必须的) 一个类的头文件 - 头文件仅用于定义。执行指令必须在相关的
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)
。此外,我们决定不在代码中使用异常。
类结构头文件中首先是公共方法(顶部是构造函数和析构函数)、受保护方法、受保护变量、私有方法、私有变量。没有公共变量,使用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.
<标题>,* position把&
和*
写在变量类型后面
的例子:
String* strPtr;
String& strRef;
这是我们决定使用的,问题是,我们没有错过什么吗?此外,是否存在全局不可接受的内容?
如果有什么不清楚的地方,请随意评论和询问,为什么我们选择了一些。
希望对以后的读者有所帮助。
标题>标题>标题>标题>标题>标题>有许多受尊敬的机构提供的编码标准:
这里有一个不错的https://wiki.ucar.edu/download/attachments/25039241/european_space_agency_standards.pdf
不确定这应该是回答还是评论。我会把答案贴出来,这样其他人就更容易评论了。
我不太喜欢你提议的缩进命名空间。有些项目可以相当深入名称空间的嵌套级别,这确实使代码不可读。
- Qt VTK交互风格的信号到小部件
- 特征:编码风格对性能的影响
- Mozilla C/C++编码风格
- 有没有像Pycharm那样的c++IDE检查编码风格
- C++ / Qt编码风格 - #define 应该去哪里
- 事实上的标准 C++11 编码风格
- 谷歌C++编码风格,没有例外规则.多线程呢?
- 分配和比较编码风格
- c++编码风格
- Java和C++的编码风格之间有什么具体的区别
- 迭代器的最佳编码风格
- Boost::asio这种奇怪的编码风格是什么
- 统一编码风格的Javascript, PHP, C和c++
- 哪些是具有优秀编码风格的开源c++项目?
- 如何确保CMakeLists.txt和FindXXX.cmake的编码风格一致?
- 只允许c++ 11的编码特性和风格
- 编码风格-C++语法问题
- 在 C/C++ 中使用堆栈进行内存管理时的编码风格
- 完全自定义Qt创建器编码风格
- 在Visual Studio和VIM中执行编码风格