typedefs and structs

Kyle Moffett mrmacman_g4 at mac.com
Wed Nov 9 10:57:11 EST 2005


On Nov 8, 2005, at 18:23:27, linas wrote:
> Off-topic: There's actually a neat little trick in C++ that can  
> help avoid accidentally passing null pointers.  One can declare  
> function declarations as:
>
>   int func (sturct blah &v) {
>     v.a ++;
>     return v.b;
>   }
>
> The ampersand says "pass argument by reference (so as to get arg  
> passing efficiency) but force coder to write code as if they were  
> passing by value" As a result, it gets difficult to pass null  
> pointers (for reasons similar to the difficulty of passing null  
> pointers in Java (and yes, I loathe Java, sorry to subject you to  
> that))  Anyway, that's a C++ trick  only; I wish it was in C so I  
> could experiment more and find out if I like it or hate it.

That technique tends to cause more problems than it solves.  If I  
write the following code:

struct foo the_leftmost_foo = get_leftmost_foo();
do_some_stuff(the_leftmost_foo);

How do I know what it is going to do?  Will it modify  
the_leftmost_foo, or is it a pass-by-value as it appears?  This is  
just as bad as defining a macro some_macro(foo,bar) that does (foo =  
bar), it's _really_ hard to tell what it does, especially when you  
aren't all that familiar with the code.  A much better solution is this:

void do_some_stuff(struct foo *the_foo) __attribute__((__nonnull__(1)));

do_some_stuff(&the_leftmost_foo);

That ensures that the first argument cannot be explicitly passed as  
null, while still being quite obvious to the programmer what it's doing.

Cheers,
Kyle Moffett

--
They _will_ find opposing experts to say it isn't, if you push hard  
enough the wrong way.  Idiots with a PhD aren't hard to buy.
   -- Rob Landley






More information about the Linuxppc64-dev mailing list