Didier Kryn <k...@in2p3.fr> writes: > Le 23/01/2016 19:28, Rainer Weikusat a écrit : >> Didier Kryn <k...@in2p3.fr> writes: >>> Le 23/01/2016 12:16, Didier Kryn a écrit : >>>> I'm curious of the reason why you specify >>>> static void print_start(char const *name, char const *what)
[...] >>> Sorry, I overlooked the code and read "char const *name" as if it >>> was "char * const name". Actually the syntax you used is equivalent to >>> "const char *name". >> That's a habit based on an observation I made when I started to write >> code in C: Type qualifiers are left-associative (presumably a misuse of >> the term) unless there's nothing to the left of them, [...] > So, we could express it as the general declaration would be: [...] > But another syntax is allowed, where the qualifier[s] can be on > the left. I'm not sure there's a BNF description of the C syntax. It's really declaration: declaration-specifiers init-declarator-list[opt] ; declaration-specifiers: storage-class-specifier declaration-specifiers[opt] type-specifier declaration-specifiers[opt] type-qualifier declaration-specifiers[opt] function-specifier declaration-specifiers[opt] Which means a type-qualifier can appear both to the left and to the right of a type specifier. Originally (as I wrote) the fact that const char * meant 'pointer to constant char' while char const * also meant this and 'constant pointer to char' had to be expressed as char * const simply annoyed me because of it's irregularity --- but now, after having had to deal with a somewhat largish Java codebase where absolutely everything had a final tacked onto it, thereby making it seriously difficult to spot the acting code among all the pointless declarational clutter, I'm presumably in the process of stopping to use const altogether. >>> It actually protects the string from being overwritten by the >>> function. >> Not really. It just asserts that the string won't be modified using this >> pointer. In theory, this would enable a compiler to optimize such >> accesses, eg, collapse many of them into one, however, in practice, gcc >> doesn't do that, and the qualifier is useless. > > The most important goal is not to optimise the executable, it is > to protect against programmer's errors. gcc will warn you if you try > to modify a constant. It won't even compile code trying to use a pointer-to-constant-something to modify something. But this usually just means that the const ought to be dropped. C is all about managing memory manually and this means whenever the content of some (set of) memory location(s) is to be modified, thought must be put into determining where this memory comes from and which other code might use it in which way. _______________________________________________ Dng mailing list Dng@lists.dyne.org https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/dng