Константы, которые надо подставлять на этапе компиляции, заменяем на имена макросов, но сами макросы в коде не объявляем. В параметры вызова препроцессора добавляем объявления нужных макросов. Если препроцессор вызывается компилятором без участия из вне, то соответствующим образом надо давать объявления компилятору.
Пример: в коде меняем константы на макросы:
clr_string (CLR_STRING_ARG_X, CLR_STRING_ARG_Y, CLR_STRING_ARG_A);
Т.к. GCC сам вызывает препроцессор с нужными параметрами, добавляем объявления макросов к списку параметров компилятора
#define aaa bbb в начале компилируемого файла.
У других компиляторов способ объявления может отличаться, но логика та же.
gcc ... -DCLR_STRING_ARG_X=2 -DCLR_STRING_ARG_Y=3 -DCLR_STRING_ARG_A=16 ...Логика для GCC такая: наличие -Daaa=bbb в качестве аргумента при вызове компилятора, равносильно наличию