Если у вас есть источник для функций в отдельных файлах (для моего примера, в f1.c и f2.c), то эта схема работает:
$ cat so.c
#define STRINGIZER(x) #x
#define HEADER(x) STRINGIZER(x)
#include HEADER(SOURCE)
int main(void)
{
return(function());
}
$ cat f1.c
static int function(void)
{
return(1);
}
$ cat f2.c
static int function(void)
{
return(2);
}
$
Тогда я могу скомпилировать так:
$ gcc -DSOURCE=f1.c -o so1 so.c
$ gcc -DSOURCE=f2.c -o so2 so.c
Обратите внимание на использование оператора stringize и танца с двойным макросом - это стандартная идиома для препроцессора Standard C. Это позволяет мне не помещать кавычки в командную строку компилятора C; подумайте, насколько сложнее было бы использовать, если бы вам пришлось написать:
$ gxx -DSOURCE='"f1.c"' -o so1.c
Результаты запуска so1 и so2 были:
$ ./so1; echo $?
1
$ ./so2; echo $?
2
$
Здесь показан альтернативный способ достижения желаемого результата без каких-либо #ifdef
строк.