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:
- 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
/* ... */
- Using the normal
if
with aconst
, 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?
I’m no C expert, so take this with a grain of salt, but wouldn’t any reasonable optimizing compiler remove the constant check at compile-time?
Of course, this is not guaranteed and depends on the compiler flags, so preproc should be preferred if compile-time is desired.