对于C ++中的变量,方法等,有什么好的命名约定?

时间:2010-09-14 05:48:50

标签: c++ naming-conventions

我来自Objective-C和Cocoa世界,那里有很多常规,许多人会说它让你的代码变得美丽! 现在用C ++编程我找不到像C ++这样的好文档。

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html

标准C ++可能没有上面的内容,但我希望我可以坚持使用其他一些SDK或API(如Microsoft的(?)等)约定。

我希望你能提供一些链接。

10 个答案:

答案 0 :(得分:86)

做任何你想做的事,只要它是最小的,一致的,doesn't break any rules

就个人而言,我发现Boost风格最简单;它与标准库匹配(给代码提供统一的外观)并且很简单。我个人分别在成员和参数的mp前缀上添加:

#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章可能会有所帮助:)呵呵

参考:http://www.amazon.com/Coding-Standards-Rules-Guidelines-Practices/dp/0321113586/ref=sr_1_1?ie=UTF8&s=books&qid=1284443869&sr=8-1-catcorr