Re: [RFC PATCH v3 0/8] Remote helpers smart transport extensions
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Dec 7, 2009, 20:07 UTC
- Message-ID
- <7vein635vn.fsf@alter.siamese.dyndns.org>
- In-Reply-To
- <20091207210608.6117@nanako3.lavabit.com>
Nanako Shiraishi <nanako3@lavabit.com> writes:
Show 7 quoted lines
> Quoting Junio C Hamano <gitster@pobox.com> > >> I queued to ease the discussion in 'pu'. I had to fix-up some conflicts >> while doing so. Please sanity check the result. > > I see that you changed many "char* variable" to "char *variable", but > what is the reason for these changes?
Nico already gave you correct and more concise version; this more verbose explanation is primarily for you who said a few times that you are not fluent in C. Others can skip this message without missing anything.
I haven't asked people why they choose to write like this:
char* string;
beyond "that is how we were taught and what we are used to".
But if I have to guess, it is because it makes it appear as if you are being consistent between basic types like "int" and pointer types like "char *". E.g. these both look like "<type> <variable>;"
int variable;
char* variable;The example in CodingGuidelines gives a clear illustration that this however is not the way how C language works. IOW, the syntax for declaration is not "<type> <var1>, <var2>,...;". E.g.
char* var1, var2;
declares var1, which is a pointer to a char, and var2, which is a char. That is what Nico means by '* is an attribute of the variable and not of the type'.
The only sane way to read declaration in C is to read from inside to outside, starting from a variable name. When you read "char **argv", for example, you treat it as "char (*(*argv))", and read it from the variable name:
- It declares argv; what's the type of it I wonder...
- It is a pointer, because the asterisk in front of it tells us that
we can dereference it. Now, what's the type of the result of
dereferencing argv, i.e. "*argv", I wonder... - That "*argv" is a pointer, because the asterisk in front of it again
tells us that we can dereference it. Now, what's the type of
dereferencing that "*argv", i.e. "**argv", I wonder...- Ah, it is a "char", that is what this declaration says.
And the style we use (which is the same as Linux kernel style) naturally matches the way how you read this declaration.