On Wed, Mar 21, 2018 at 11:54 AM, Alexei Starovoitov <ast@xxxxxx> wrote: > > add fancy macro to compute number of arguments passed into tracepoint > at compile time and store it as part of 'struct tracepoint'. We should probably do this __COUNT() thing in some generic header, we just talked last week about another use case entirely. And wouldn't it be nice to just have some generic infrastructure like this: /* * This counts to ten. * * Any more than that, and we'd need to take off our shoes */ #define __GET_COUNT(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_n,...) _n #define __COUNT(...) \ __GET_COUNT(__VA_ARGS__,10,9,8,7,6,5,4,3,2,1,0) #define COUNT(...) __COUNT(dummy,##__VA_ARGS__) #define __CONCAT(a,b) a##b #define __CONCATENATE(a,b) __CONCAT(a,b) and then you can do things like: #define fn(...) __CONCATENATE(fn,COUNT(__VA_ARGS__))(__VA_ARGS__) which turns "fn(x,y,z..)" into "fn<N>(x,y,z)". That can be useful for things like "max(a,b,c,d)" expanding to "max4()", and then you can just have the trivial #define max3(a,b,c) max2(a,max2(b.c)) etc (with proper parentheses, of course). And I'd rather not have that function name concatenation be part of the counting logic, because we actually may have different ways of counting, so the concatenation is separate. In particular, the other situation this came up for, the counting was in arguments _pairs_, so you'd use a "COUNT_PAIR()" instead of "COUNT()". NOTE NOTE NOTE! The above was slightly tested and then cut-and-pasted. I might have screwed up at any point. Think of it as pseudo-code. Linus -- To unsubscribe from this list: send the line "unsubscribe linux-api" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html