这两个与结构体相关的声明有什么区别吗?

3
我有以下结构。
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更加“清晰”,因为他们不喜欢星号或其他原因。::耸肩:: - Mr Lister
7个回答

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

您还应该查看以下问题:
何时应在C ++中使用typedef?
为什么结构体名称需要typedef?

希望这可以帮助您。


2

是的,它们是完全相同的。

定义指针类型的一个好理由是为了复杂的表达式。例如,如果你有一个函数需要传递一个指针的引用,哪种方式更容易理解呢?

void foo(PLSHFunctionT & ref);

void foo(LSHFunctionT * (&ref));

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


void foo(LSHFunctionT * & ref) 是可以的。不需要使用额外的大括号。 - Nawaz
@Nawaz,谢谢。但你看我的观点——如果不是每天都做的话,很难记住。起初我确实写错了,但我进行了快速编辑。 - Mark Ransom
是的。犯错误很容易。有人可能会尝试 void foo(LSHFunctionT & * ref),这是一个编译错误。但是当你使用 typedef 时同样可能出现问题。例如 typedef T& RT;void foo(RT * ptr),这也是一个编译错误。 - Nawaz

1

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


1

表面上看,这两者之间没有区别。然而,使用指针typedef时,无法将其声明为指向常量的指针,只能声明为指向非常量的常量指针。

例如,您可以说

const LSHFunctionT* const_ptr;但是const PLSHFunctionT const_ptr2;使指针成为常量,而不是指向的对象。

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


0

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

PLSHFunctionT calls[];

比这个更易于阅读:

LSHFunctionT *calls[];

0

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


0

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

如果我想声明一个指针,我个人更喜欢明确地使用*。在大多数情况下,这可以使代码更易读。尽管有时候使用指针类型的typedef可以增加可读性,但通常会降低可读性,特别是当你使用Windows API时。


啊,是的,Windows API,有它的PSTR、LPSTR、PCSTR、LPCSTR、LPCTSTR、LPUTSTR、LPCUTSTR等等。太好了。 - Mr Lister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接