/* dummy variables to play with */ int a = 0, b = 0, c = 0; /* first flag */ #define MY_FIRST_FLAG (1 << 0) /* second flag */ #define MY_SECOND_FLAG (1 << 1) /* * some param that could have three variants */ #define __MY_TRISTATE_OFFSET 2 #define __MY_TRISTATE_MASK (0x03 << __MY_TRISTATE_OFFSET) #define _MY_TRISTATE_ONE (0 << __MY_TRISTATE_OFFSET) #define _MY_TRISTATE_TWO (1 << __MY_TRISTATE_OFFSET) #define _MY_TRISTATE_THREE (2 << __MY_TRISTATE_OFFSET) /* third flag */ #define MY_THIRD_FLAG (1 << 4) void my_func(int opts) { if (opts & MY_FIRST_FLAG){ a++; } switch (opts & __MY_TRISTATE_MASK){ case _MY_TRISTATE_ONE: b++; break; case _MY_TRISTATE_TWO: c++; break; case _MY_TRISTATE_THREE: c += 2; break; default: c--; break; } a += 2; } enum my_tristate_e { MY_TRISTATE_ONE, MY_TRISTATE_TWO, MY_TRISTATE_THREE, }; struct my_func_opts_s { unsigned my_first_flag : 1; unsigned my_second_flag : 1; enum my_tristate_e my_tristate : 2; unsigned my_third_flag : 1; }; void my_func2(struct my_func_opts_s opts) { if (opts.my_first_flag){ a++; } switch (opts.my_tristate){ case MY_TRISTATE_ONE: b++; break; case MY_TRISTATE_TWO: c++; break; case MY_TRISTATE_THREE: c += 2; break; default: c--; break; } a += 2; } int main(int argc, char** argv) { my_func(_MY_TRISTATE_TWO | MY_FIRST_FLAG); my_func2((struct my_func_opts_s){ .my_first_flag = 1, .my_tristate = MY_TRISTATE_TWO, }); return 0; }