On Thu, Aug 27, 2020 at 10:36:36PM +0100, Al Viro wrote: > On Thu, Aug 27, 2020 at 01:46:33PM -0700, Linus Torvalds wrote: > > You really have to pick some pretty excessive type names (or variable > > names) to get close to 80 characters. Again, to pick an example: > > > > struct timer_group_priv *priv = container_of(handle, > > struct timer_group_priv, timer[handle->num]); > > > > ends up being long even if you were to split it, but that funky > > container_from() wouldn't have helped the real problem - the fact that > > the above is complex and nasty.
The point about doing the assignment with the declaration certainly makes the "ugliness" worse, I agree. I'm still not generally convinced about the redundancy level pros/cons, but I concede that having a common idiom (rather than a succinct but subsystem-dependent idiom) is better for people reading the code for the first time. > > And I had to _search_ for that example. All the normal cases of > > split-line container-of's were due to doing it with the declaration, > > or beause the first argument ended up being an expression in itself > > and the nested expressions made it more complex. > > Speaking of searching, this kind of typeof use is, IMO, actively > harmful - it makes finding the places where we might get from > e.g. linked list to containing objects much harder. container_of > (unless combined with obfuscating use of typeof()) at least gives > you a chance to grep - struct foo *not* followed by '*' is a pattern > that doesn't give too many false positives. This one, OTOH, is > essentially impossible to grep for. And this observation about workflow does strike a chord with me. I do end up with those kind of searches too. In trying to examine my preferences here, I think my instincts are to avoid open-coded types (leading me to want to use typeof()) but I think those instincts were actually developed from dealing with _sizeof_ and all the way it goes terribly wrong. So, okay, I'm convinced. container_of() it is. Doing these conversions becomes a little less mechanical if assignment needs to be split from declaration, but hey, we've got a 100 character line "limit" now, so maybe it'll be less needed. :) -- Kees Cook