void call(); struct S { static void foo() { call(); call(); } static void bar() { call(); call(); } static void baz() {} }; #ifdef FILE1 # define FUNC_NAME func1 # define FUNC_BODY \ S::foo(); S::bar(); S::baz(); #else # define FUNC_NAME func2 # define FUNC_BODY \ S::bar(); #endif void FUNC_NAME() { FUNC_BODY } // Build instructions: // $ clang -g -fPIC -c -DFILE1 arange-overlap.cc -o obj1.o // $ clang -g -fPIC -c arange-overlap.cc -o obj2.o // $ clang -shared obj1.o obj2.o -o <output>