Suppose that I have two features in my C program, feature foo and feature bar. I wish to be able to switch what features will be compiled into my program at compile time. The only two ways I know of doing this are:

  1. Using preprocessor directives
#define MYPROG_FEATURE_FOO 1
#define MYPROG_FEATURE_BAR 1

/* ... */

#if MYPROG_FEATURE_FOO == 1
/* code related to feature foo */
#else
/* code to prompt people to pay for the absolutely proprietary version of my program */
#endif

/* ... */

#if MYPROG_FEATURE_BAR == 1
/* code related to feature bar */
#else
/* code to prompt people to pay for the absolutely proprietary version of my program */
#endif

/* ... */

  1. Using the normal if with a const, non-volatile variable
const _Bool myprog_feature_foo = 1;
const _Bool myprog_feature_bar = 1;

/* ... */

if (myprog_feature_foo)
{
  /* code related to feature foo */
}
else
{
  /* buy proprietary version or no feature for you >:) */
}

/* ... */

if (myprog_feature_bar)
{
  /* code related to feature bar */
}
else
{
  /* buy proprietary version or no feature for you >:) */
}

/* ... */

What’s the better way to do this? Is there a third way to achieve this that I have missed that’s better than the above two?

  • alejandro@kbin.social
    link
    fedilink
    arrow-up
    4
    ·
    1 year ago

    Another way would be to keep the proprietary code in their own compilation units, and replace them with a dummy/stub implementation from your build system at config time (e.g. CMake option + if() statement). One benefit to this is that you don’t have to litter your codebase with a bunch of preprocessor directives.

    There’s no “better” way though, just pick the one you find easier to manage.