3 ms·
Please do share.
by RhysU 8y ago
Please do share.
- isaachier 8y agoI imagine this is about tgmath.h. I've found the use of the word generic a bit misleading there.
- cygx 8y agoNo, it's very likely about _Generic. <tgmath.h> was added to C99 in an attempt to steal Fortran mindshare, ie making numerics and scientific computing less cumbersome (the same is true for other features, eg complex numbers or restrict). But in C99, it was still special-cased. The next standard C11 introduced _Generic so people could create their own type-generic interfaces.
- thechao 8y agoAs, below, there's a new statement: '_Generic()'. The expression looks like this: _Generic(x, type : value, ..., [default : value]) For a list of unique types, with an optional 'default' for any unrecognized type. You usually wrap the call to '_Generic' in a macro. For instance: #define vec_push_back(vec, val) \ _Generic(&vec, \ vecint : vecint_push_back, \ vecdbl : vecdbl_push_back, \ default : assert_vwrap)(&vec, val) Assuming that types 'vecint' and 'vecdbl' have been defined by the user. This does single-parameter parametric type dispatch. There's way to allow the user to use table-driven macros ('X-macros') to allow per-translation-unit definition of an arbitrary number of instantiations. The nice part, over C++, is that the generic instantiation is localized to a single translation-unit file, so you don't have to yell at the junior devs for instantiating templates without using an 'extern' construct.