5 ms·
C99 is nice, but C still lacks generic. I am not talking about C++ template nonsense, but not having to write max element search for every primitive type. I am
by f00fc0d3 11y ago
C99 is nice, but C still lacks generic. I am not talking about C++ template nonsense, but not having to write max element search for every primitive type.
I am working in DSP project which was started with typical C++ OO BS, finally with ended up with C compiled as C++ + some simple templates for cases as above.
- bluetomcat 11y agoUsing statement expressions and the typeof extension, you are able to write function-like, type-generic, scope-insensitive macros like this one: #define MAX(a,b) ({ \ typeof (a) _a = (a); \ typeof (b) _b = (b); \ _a > _b ? _a : _b; \ }) The inability to write template functions can be compensated by designing your function so that it takes a function pointer where the type-specific action occurs.
- nly 11y agoYour MAX has no respect for namespaces or scopes. A real world macro is probably going to be called MYLIBRARY_MAX to avoid this. Secondly the C++ lambda solution is just easier to read. auto max = [](auto a, auto b) { return (a > b) ? a : b; }; max (3.1415, 42); // returns double max (42ul, 78u); // returns unsigned long max (17, 16); // returns int
- f00fc0d3 11y agoTypeof is not standard and many DSP compilers do not implement that. Secondly I meant max search in array, not between to scalar values which is trivial. I really don't want to have for(...) inlined everywhere.
- stinos 11y agoI am not talking about C++ template nonsense, but not having to write max element search for every primitive type How is it template 'nonsense', when those templates do exactly that?
- f00fc0d3 11y agoTemplate metaprograming is nonsense, not simple type substitution. C++ templates are just too much, especially when mixed with substandard developers.
- pjc50 11y agoC has a generic: "void *". It just doesn't have any type safety.
- ksherlock 11y agoC11 has type generic macros. You can build your own with the _Generic statement. int maxi(int, int); double: maxd(double, double); ... #define max(x) _Generic((x), int: maxi, double: maxd, ...default: maxi)
- f00fc0d3 11y agoYeah, but you still need to write those maxi, maxd :-(