我来自Objective-C和Cocoa世界,那里有很多常规,许多人会说它让你的代码变得美丽! 现在用C ++编程我找不到像C ++这样的好文档。
标准C ++可能没有上面的内容,但我希望我可以坚持使用其他一些SDK或API(如Microsoft的(?)等)约定。
我希望你能提供一些链接。
答案 0 :(得分:86)
做任何你想做的事,只要它是最小的,一致的,doesn't break any rules。
就个人而言,我发现Boost风格最简单;它与标准库匹配(给代码提供统一的外观)并且很简单。我个人分别在成员和参数的m
和p
前缀上添加:
#ifndef NAMESPACE_NAMES_THEN_PRIMARY_CLASS_OR_FUNCTION_THEN_HPP
#define NAMESPACE_NAMES_THEN_PRIMARY_CLASS_OR_FUNCTION_THEN_HPP
#include <boost/headers/go/first>
#include <boost/in_alphabetical/order>
#include <then_standard_headers>
#include <in_alphabetical_order>
#include "then/any/detail/headers"
#include "in/alphabetical/order"
#include "then/any/remaining/headers/in"
// (you'll never guess)
#include "alphabetical/order/duh"
#define NAMESPACE_NAMES_THEN_MACRO_NAME(pMacroNames) ARE_ALL_CAPS
namespace lowercase_identifers
{
class separated_by_underscores
{
public:
void because_underscores_are() const
{
volatile int mostLikeSpaces = 0; // but local names are condensed
while (!mostLikeSpaces)
single_statements(); // don't need braces
for (size_t i = 0; i < 100; ++i)
{
but_multiple(i);
statements_do();
}
}
const complex_type& value() const
{
return mValue; // no conflict with value here
}
void value(const complex_type& pValue)
{
mValue = pValue ; // or here
}
protected:
// the more public it is, the more important it is,
// so order: public on top, then protected then private
template <typename Template, typename Parameters>
void are_upper_camel_case()
{
// gman was here
}
private:
complex_type mValue;
};
}
#endif
这。 (就像我在评论中所说的那样,不为您的代码采用Google样式指南,除非它与命名约定无关紧要。)
答案 1 :(得分:26)
可能存在与个体一样多的命名约定,辩论与使用哪种支撑样式等无穷无尽(并且无菌)。
所以我会有两个建议:
其余由你决定。
答案 2 :(得分:18)
我实际上经常使用Java样式:PascalCase用于类型名称,camelCase用于函数和变量,CAPITAL_WORDS用于预处理器宏。我更喜欢Boost / STL约定,因为您不必使用_type
的后缀类型。 E.g。
Size size();
而不是
size_type size(); // I don't like suffixes
这具有额外的好处,即StackOverflow代码格式化程序将Size
识别为类型名称; - )
答案 3 :(得分:10)
我们遵循此页面上列出的指南:C++ Programming Style Guidelines
我还建议您阅读The Elements of C++ Style by Misfeldt et al,这是一本关于此主题的优秀书籍。
答案 4 :(得分:5)
对于它的价值,C ++的原作者Bjarne Stroustrup有他自己喜欢的风格,在这里描述:http://www.stroustrup.com/bs_faq2.html
答案 5 :(得分:3)
虽然很多人会建议或多或少严格的Hungarian notation变体(scary!),但对于命名建议,我建议你看一下Google C++ Coding Guidelines。这可能不是最流行的命名约定,但至少它相当完整。除了合理的命名约定之外,还有一些有用的指导原则,但是大部分都应该采用一些方法(例如禁止例外,并且倾向于远离现代C ++编码风格)。
虽然我个人喜欢STL和Boost的极端低科技会议风格;)。
答案 6 :(得分:2)
一致性和可读性(自我记录代码)很重要。可以而且应该使用一些线索(例如案例)来避免冲突,并指出是否需要实例。
我遇到的最佳实践之一是使用代码格式化程序(astyle和uncrustify是2个例子)。代码格式化程序可以破坏您的代码格式 - 配置格式化程序,让它完成它的工作。严肃地说,忘记手动格式化并进入使用它们的练习。他们将节省大量时间。
如上所述,对命名非常具有描述性。另外,对于作用域(类类型/数据/名称空间/匿名名称空间)非常具体。一般来说,我非常喜欢java的常用书面形式 - 这是一个很好的参考,类似于c ++。
对于特定的外观/命名,这是一个类似于我使用的小样本(变量/参数是lowerCamel,这只展示了语言功能的一部分):
/** MYC_BEGIN_FILE_ID::FD_Directory_nanotimer_FN_nanotimer_hpp_::MYC_BEGIN_FILE_DIR::Directory/nanotimer::MYC_BEGIN_FILE_FILE::nanotimer.hpp::Copyright... */
#ifndef FD_Directory_nanotimer_FN_nanotimer_hpp_
#define FD_Directory_nanotimer_FN_nanotimer_hpp_
/* typical commentary omitted -- comments detail notations/conventions. also, no defines/macros other than header guards */
namespace NamespaceName {
/* types prefixed with 't_' */
class t_nanotimer : public t_base_timer {
/* private types */
class t_thing {
/*...*/
};
public:
/* public types */
typedef uint64_t t_nanosecond;
/* factory initializers -- UpperCamel */
t_nanotimer* WithFloat(const float& arg);
/* public/protected class interface -- UpperCamel */
static float Uptime();
protected:
/* static class data -- UpperCamel -- accessors, if needed, use Get/Set prefix */
static const t_spoke Spoke;
public:
/* enums in interface are labeled as static class data */
enum { Granularity = 4 };
public:
/* construction/destruction -- always use proper initialization list */
explicit t_nanotimer(t_init);
explicit t_nanotimer(const float& arg);
virtual ~t_nanotimer();
/*
public and protected instance methods -- lowercaseCamel()
- booleans prefer is/has
- accessors use the form: getVariable() setVariable().
const-correctness is important
*/
const void* address() const;
virtual uint64_t hashCode() const;
protected:
/* interfaces/implementation of base pure virtuals (assume this was pure virtual in t_base_timer) */
virtual bool hasExpired() const;
private:
/* private methods and private static data */
void invalidate();
private:
/*
instance variables
- i tend to use underscore suffix, but d_ (for example) is another good alternative
- note redundancy in visibility
*/
t_thing ivar_;
private:
/* prohibited stuff */
explicit t_nanotimer();
explicit t_nanotimer(const int&);
};
} /* << NamespaceName */
/* i often add a multiple include else block here, preferring package-style inclusions */
#endif /* MYC_END_FILE::FD_Directory_nanotimer_FN_nanotimer_hpp_ */
答案 7 :(得分:1)
真的没关系。只需确保描述性地命名变量和函数。也是一致的。
现在比看到这样的代码更糟糕了:
int anInt; // Great name for a variable there ...
int myVar = Func( anInt ); // And on this line a great name for a function and myVar
// lacks the consistency already, poorly, laid out!
编辑:正如我的评论者指出的那样,整个团队需要保持一致性。因此,只要保持一致性,您选择的方法并不重要。然而,没有正确或错误的方法。我工作的每个团队都有不同的想法,我已经适应了那些。
答案 8 :(得分:1)
人们在编写C ++时会使用许多不同的语言/约定。例如,有些人喜欢使用大写字母(myVar或MyVar)或使用下划线(my_var)来分隔单词。通常,使用下划线的变量都是小写的(根据我的经验) 还有一种叫做匈牙利语的编码风格,我认为它是微软使用的。我个人认为这是浪费时间,但它可能证明是有用的。这是变量名称给出的短前缀,如i,或f,以提示变量类型。例如:int iVarname,char * strVarname。
您可以使用_t结束结构/类名称,以区别于变量名称。 E.g:
class cat_t {
...
};
cat_t myCat;
通常也可以添加词缀来指示指针,例如pVariable或variable_p。
总的来说,确实没有任何单一的标准,但很多。关于命名变量的选择并不重要,只要它是可以理解的,最重要的是,一致的。一致性,一致性,一致性! (尝试输入三次!)
如果所有其他方法都失败了,请谷歌。
答案 9 :(得分:0)
不像您提供的链接那么简洁:但是下面的第14 - 24章可能会有所帮助:)呵呵