【问题标题】:Is there a difference between these two stuct-related declarations?这两个与 stuct 相关的声明之间有区别吗?
【发布时间】:2012-02-28 05:23:27
【问题描述】:

我有以下结构

typedef struct _LSHFunctionT 
{
    double *a;
    double b;
} LSHFunctionT, *PLSHFunctionT;

我的问题是;这两个声明有区别吗

PLSHFunctionT myPointer1;

LSHFunctionT *myPointer2;

如果不是,那为什么人们要明确使用其中的两个(LSHFunctionT 和 *PLSHFunctionT)。为什么不直接使用 LSHFunctionT。

下面的两个声明是不是也一样

PLSHFunctionT *myPointer3;

LSHFunctionT **myPointer3;

【问题讨论】:

  • 对于你的问题“为什么人们明确使用它们中的两个(LSHFunctionT 和 *PLSHFunctionT)”,我认为有些人只是觉得写Pwhatever ptr 比写whatever* ptr 更“干净”,因为他们不喜欢星号之类的。 ::耸肩::

标签: c++ pointers struct


【解决方案1】:

区别在于强调。通常不明确写 * 可能表明 PLSHFunctionT 被设计为用作句柄(不知道/访问结构元素)。如果 * 被显式写入,如在 LSHFunctionT *myPointer 中,它可能表示将用于访问值的数组或结构。

【讨论】:

    【解决方案2】:
    typedef struct _LSHFunctionT 
    {
        double *a;
        double b;
    } LSHFunctionT, *PLSHFunctionT;
    

    是的,PLSHFunctionT x; 等于 LSHFunctionT* x;

    是的,PLSHFunctionT* x; 等于 LSHFunctionT** x;

    typedef 的目的是为现有类型分配新名称。您可以定义typedef int lol; 并声明变量lol i;,但编译器无论如何都会考虑它int

    您还应该检查以下问题:
    When should I use typedef in C++?
    Why should structure names have a typedef?

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      表面上两者没有区别。但是,使用指针 typedef 无法将其声明为指向 const 的指针,只能将其声明为 const-pointer-to-non-const。

      比如你可以说

      const LSHFunctionT* const_ptr;const PLSHFunctionT const_ptr2; 使指针变为常量,而不是指针。

      最后请注意,在 C++ 中,整个事情的合法性值得怀疑,因为以 _<capital> 开头的名称是为实现保留的,而 typedef 几乎从不以这种方式使用。

      【讨论】:

        【解决方案4】:

        这些声明是相同的。在某些情况下,指针类型定义方法提高了代码的可读性。有人可能会争辩说:

        PLSHFunctionT calls[];
        

        比这更容易阅读:

        LSHFunctionT *calls[];
        

        【讨论】:

          【解决方案5】:

          是的。它们完全相同,即使在第二种情况下也是如此。

          如果我想声明一个指针,我个人更喜欢显式使用*。在大多数情况下,它使代码可读。使用指针类型的typedef 通常会降低可读性,但有时它可能会提高可读性,尤其是在使用 Windows API 时。

          【讨论】:

          • 啊,是的,Windows API 及其 PSTR、LPSTR、PCSTR、LPCSTR、LPCTSTR、LPUTSTR、LPCUTSTR 等。可爱的。
          【解决方案6】:

          是的,它们是相同的。

          定义指针类型的一个很好的理由是复杂的表达式。例如,如果你有一个引用指针的函数,你觉得哪个更容易理解?

          void foo(PLSHFunctionT & ref);
          
          void foo(LSHFunctionT * (&ref));
          

          我什至不确定第二个的语法是否正确!

          【讨论】:

          • void foo(LSHFunctionT * & ref) 很好。无需使用额外的大括号。
          • @Nawaz,谢谢。但是你明白我的意思——如果这不是你每天都做的事情,很难记住。起初我确实有错误,但我做了一个快速编辑。
          • 是的。它很容易出错。可以尝试void foo(LSHFunctionT & * ref),这是一个编译错误。但是当您使用typedef 时同样可能。例如typedef T& RT;void foo(RT * ptr)这是编译错误。
          【解决方案7】:

          我似乎没有区别。有不同的编程风格。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-06-07
            • 2011-02-20
            • 1970-01-01
            • 2023-03-18
            • 1970-01-01
            相关资源
            最近更新 更多