18 comments

[ 3.7 ms ] story [ 27.4 ms ] thread
Is it just me, or is this just an extremely convoluted way of doing things?

I know it says it is a trick, but I'm not sure I completely get it.

I agree... if I see an `#if defined _WIN32` I know what I'm looking at, but this trick would be a complete surprise.
It is. The page starts with talk about namespaces and such, so one thinks this will be about some cool new features of C++11, but instead ends with a global #define.

Yes, coding like this is evil and will eat your hamster. For example, trying to have a variable named "platform" will break your code in strange ways. And before you say "but it's C++, it's modern", CppCoreGuidelines explicitly say this is bad and that one should favor #ifdefs. (https://github.com/isocpp/CppCoreGuidelines/blob/master/CppC...)

author Yes, "PLATFORM" should be clearly marked with uppercase. Fixed. Thank you.

There have to be some kind of "-DPLATFORM=arm" definition, one have to tell to the compiler in some way what hardware we are running on...

The title says "C/C++", but the sample code is C++, and I can't find any mention of support for "inline namespace" in C. Are there C compilers that support it as an extension?
No, the post says "or C-style code", which is presumably just C++ when you aren't using classes or templates or something like that.
I wouldn't call that "C-style code". Namespaces are a C++-specific feature, and inline namespaces were introduced in C++-11. C has never had either feature.
OK we took out the "C/" bit above.
Thank you.

Yes - I forgot that there are no namespaces in C. Still, it does works for an approximation of 'C-style code' (no templates, virtual functions, etc).

How about using weak linking instead...
From the page:

"This technique is an alternative to weak linking,..."

I think they're asking why one might use this instead of weak linking, which is something the article does not explain.
author here. Unlike weak linking, this method works for functions, templated functions and templates.

The design spec can say - only static linking, good inlining during compile-time, no full-program-optimization will be performed. Even if allowed, I'm not sure, if weakly linked functions are being inlined during link-time-optimization step.

Yes! The problem is, alternative implementations are also meta-programming tricks! Template meta-programming techniques like 'C++ Traits' and 'Curiously recurring template pattern'. Both are being used in the performance-critical places by the way (think Eigen library, etc).

Is there some other alternative that allows 'compile-time static overrides' with relatively clean syntax?