C++中的函数名称:是否大写?

use*_*514 62 c++ coding-style function naming-conventions

在C++中命名函数的惯例是什么?

我来自Java环境所以我通常命名为:

myFunction(...) {
}
Run Code Online (Sandbox Code Playgroud)

我在C++中看过混合代码,

myFunction(....)
MyFunction(....)
Myfunction(....)
Run Code Online (Sandbox Code Playgroud)

什么是正确的方法?

另外,对于类方法还是非类方法,它是一样的吗?

int*_*nt3 40

没有'正确的方法'.虽然有一些约定,但它们在语法上都是正确的.你可以按照谷歌风格指南,虽然还有其他人.

来自上述指南:

常规功能有大小写; 访问器和mutator匹配变量的名称:MyExcitingFunction(),MyExcitingMethod(),my_exciting_member_variable(),set_my_exciting_member_variable().

  • 有一种标准方式...所有标准库代码中使用的标准命名约定是my_name,但MACRO_NAMES或TemplateParameterTypeNames除外.这是从unix C约定派生的.Camel case是一种源自microsoft c和c ++代码的约定.CamelCase更难阅读. (22认同)
  • 匈牙利表示法来自微软.TitleCase和camelCase更老,并且已经在计算之外用作snake_case的替代品. (8认同)
  • _Actually_有一个"正确的方法".或者更具体地说,有一种"不正确的方式".也就是说,如果你想使你的类使用基于__range的`for`-loop__,[你必须定义名为`begin`和`end`的函数](http://stackoverflow.com/q/8164567/3425536 ).C++不支持`PascalCase`. (4认同)
  • 同样,在我看来,我发现微软比任何其他软件公司都更能统一和加速计算机的使用和采用。谷歌在开源方面做了很多工作,最初比微软做得更多,但我不同意开源代码本身就有价值。微软提供了许多智能框架来指导专有和开源软件。如果没有共同协作的协议,互联网就不会是今天的样子。他们智能地统一了硬件,这是其他公司无法做到的。即使他们似乎也无法再这样做了。 (3认同)

eml*_*lai 38

由于C++ 11,您可能需要为使用snake_casecamelCase 用于函数名.

这是因为要使类在基于范围的for循环中作为range-expression运行,您必须为该类定义调用beginend(区分大小写)的函数.

因此,使用例如PascalCase函数名称意味着如果您需要使用基于范围的类来处理类,则必须打破项目中的命名一致性.

  • @Dess:是的,但结果混合不会让它变得更好.因此,如果您开始一个新项目,建议不要将PascalCase用于函数名称. (6认同)
  • 我不同意。您可以对方法使用 PascalCase,然后对需要它的特定类使用开始/结束名称。这与从具有与您自己的命名转换不同的第三方继承结构的子类完全相同。 (4认同)
  • @endavid `main` 并不比snake_case 更驼峰式。 (4认同)
  • 另外,由于全局函数main在LowererCamelCase中,我至少要对全局函数名投票。 (2认同)

Don*_*nie 27

我见过的大多数代码都是camelCase函数(小写首字母),ProperCase/PascalCase类名和(最常见的)snake_case变量.

但是,说实话,这只是指导.最重要的是在整个代码库中保持一致.选择看似自然/适合你的东西,并坚持下去.如果您正在加入正在进行的项目,请遵循他们的标准.

  • 这就是我正在使用的,但是命名空间呢?有 `std::vector` 而有 `Project::Connection::TcpHandler` 是不是很奇怪? (2认同)

Ste*_*ith 16

我在生产代码中看到的最常见的是(按此顺序):

myFunctionName     // lower camel case

MyFunctionName     // upper camel case

my_function_name   // K & R ?
Run Code Online (Sandbox Code Playgroud)

我发现程序员在C++代码中使用的命名约定通常与他们的编程背景有关.

例如,前java程序员倾向于使用较低的驼峰案例来实现功能


Tof*_*eer 11

如果你看一下标准库,模式通常是my_function,但每个人似乎都有自己的方式: - /

  • https://xkcd.com/927/ 和“标准的伟大之处在于有很多标准” (6认同)
  • 为啥这个不上啊。标准库实际上告诉您大多数语言中代码风格的标准。 (3认同)

Ste*_*sop 7

就个人而言,我更喜欢thisStyleThisStyle的功能.这真的是为了个人品味,可能受Java影响,但我非常喜欢功能和类看起来不同.

但是,如果我不得不争论它,我会说这种区别不仅仅是审美.当你遇到临时的功能式构造时,它会节省一点点思考.与此相反,您可以认为无论是否Foo(1,2,3)是函数调用实际上并不重要- 如果它是构造函数,那么它的行为就像一个函数返回Foo的值.

该约定还避免了C++继承的函数 - 同名 - 一个类不是错误的惨败,因为C有一个单独的标记命名空间:

#include <iostream>

struct Bar {
    int a;
    Bar() : a(0) {}
    Bar(int a) : a(a) {}
};

struct Foo {
    Bar b;
};

int Bar() {
    return 23;
}

int main() {
    Foo f;
    f.b = Bar();
    // outputs 23
    std::cout << f.b.a << "\n";
    // This line doesn't compile. The function has hidden the class.
    // Bar b;
}
Run Code Online (Sandbox Code Playgroud)

毕竟,Bar既是名词又是动词,因此可以合理地定义为一个地方的一个阶级和另一个地方的一个功能.显然,有更好的方法可以避免冲突,例如正确使用命名空间.正如我所说,实际上,这只是因为我更喜欢具有小写首字母的函数外观,而不是因为实际上需要将它们与类区分开来.


Lau*_*ves 5

与Java不同,C++没有"标准样式".我曾经工作的几乎所有公司都有自己的C++编码风格,大多数开源项目也都有自己的风格.您可能需要查看的一些编码约定:

值得注意的是,C++编码标准通常会指定语言的哪些部分不使用.例如,Google C++样式指南中说"我们不使用C++异常".我工作过的几乎所有地方都禁止使用C++的某些部分.(一个地方我的工作基本上是说,"在C程序,但newdelete是没关系"!)