【问题标题】:(C++ pointers) difference between var declarations(C++ 指针) var 声明之间的区别
【发布时间】:2012-03-02 10:12:50
【问题描述】:

变量声明有什么区别:

//version 1
MyClass* myVar = [[MyClass alloc] init];
//version 2
MyClass * myVar = [[MyClass alloc] init];
//version 3
MyClass *myVar = [[MyClass alloc] init];

每个版本的对象myVar 会发生什么变化?

【问题讨论】:

  • 完全没有区别!因为c++不考虑空格格式

标签: objective-c pointers


【解决方案1】:

纯粹的风格,没有区别。在 C 语言中,开发人员倾向于选择后一种风格,原因可能很简单,因为它使声明多个指针更加清晰:

int *ptr1, *ptr2;
...

这也是最初的流行作者的风格,当 C 出现时,如 Kernighan 和 Ritchie 的 C 编程语言。顺便说一句,Dennis Ritchie 创建了 C。

但是,包括 Stroustrup 本人(C++ 的创造者)在内的许多现代 C++ 开发人员倾向于支持第一种约定:

int* ptr = ...;

这种偏好的理由可能归结为以下几点:

  1. 在 C++ 中,我们有模板需要我们自己指定类型。 vector<int*> 似乎更直接地将 int* 强调为单一类型而不是 vector<int *> 或其他一些变体。

  2. 在遵守旨在促进安全设计的 C++ 编码标准时,我们不希望经常一次定义多个变量,因为我们通常希望在可以有意义地初始化它们时定义它们(避免潜在的错误限制范围并立即初始化它们)。 *

    • 这与 C 完全不同,C 中的每个变量都需要在作用域的顶部声明,这导致许多 C 开发人员习惯于一次声明多个。

【讨论】:

    【解决方案2】:

    MyClass* myVarMyClass * myVarMyClass *myVar 之间的任何声明都没有区别:这是程序员的偏好。

    许多程序员更喜欢MyClass *myVar,因为它可以防止犯以下简单错误(如果程序员打算声明两个指向MyClass 的指针):

    MyClass* myVar, myVar2;
    

    其中myVar2 不是MyClass*,而是MyClass

    【讨论】:

    • 请注意,声明 MyClass 类型的变量(假设 OP 在将问题标记为 Obj-C 时是正确的)是无效的,并且会产生编译器错误。
    【解决方案3】:

    您的三个建议之间没有语义差异。

    本质上,当解析代码文件时,预处理器将所有内容拆分为标记,并且编译过程的所有后续传递都专门处理这些标记。因此,间距 标记之间被完全忽略。

    简单指针声明的语法(声明单个元素且未初始化)由三个标记组成:类型说明符、星号(表示变量是指针),最后是标识符。因此,您可以在这三个之间有任意数量的空格,而完全不改变语义。

    人们选择一种方式而不是另一种方式的原因与风格及其对意图的表达有关。

    MyClass* myVar 明确表示 myVar 的类型是 MyClassMyClass *myVar 明确指出指针标记属于myVar 变量。

    因此,如果您决定在单个语句中声明变量列表,则特别推荐第二种选择。如MyClass myVar, *myPointerToVar

    另一个不错的选择是始终使用MyClass* myVar 变体,并且永远不要在声明中列出几个变量,其中一些是指针。

    【讨论】:

      猜你喜欢
      • 2020-06-07
      • 1970-01-01
      • 2012-11-28
      • 2010-09-19
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      相关资源
      最近更新 更多