On Sun, Feb 27, 2022 at 6:07 PM Douglas McIlroy < douglas.mcilroy@dartmouth.edu> wrote: > > The X11 tree was a heavily ifdef-ed. And it needed to be, I don't have > > an answer as to how you would reuse all that code on different hardware > > in a better way. > > Plan 9 did it with #include. The name of the included file was the same for > every architecture. Only the search path for include files changed. Done > with > care, this eliminates the typical upfront #ifdefs.that define constants > and set > flags. > The qemu project does this, for the most part. It makes things a lot easier, but does take some getting used to to find the proper file to be included. It helps a lot to keep the twisty maze of #ifdefs down to a dull roar. FreeBSD (and all the BSDs) has a similar philosophy. You define the page size, for example, of the target, and the rest of the system is written to that abstraction rather than having #ifdefs in a lot of places. NetBSD is much better about keeping the total number of #ifdefs out of MI code than FreeBSD. In both cases, most of the #ifdefs are basically #ifdef __HAS_FUNKY_THING #endif that are needed on a couple of architectures, though usually that idiom is expressed by a macro (that's empty for most platforms) or an inline function. > Other preprocessor conditionals can usually be replaced by a regular if, > letting > the compiler optimize away the unwanted alternative. This makes > conditionals > obey the scope rules of C. > As long as they are always defined... :) Though older gcc/clang compilers get cranky when they view the if expression as a tautology (warning about the idiom rather than encouraging it: stupid clang tricks). Warner