Ну, я немного неохотно признаюсь, что знаю один способ сделать эту работу.
Атакуйте его с другого направления. Вы хотите, чтобы ваш компилятор видел нечто подобное.
#define QUOTIENT 4
#include <stdio.h>
int main(void)
{
printf("QUOTIENT: %d\n", QUOTIENT);
return 0;
}
Как мы можем это сделать, не используя буквальное число "4" в определении QUOTIENT, поскольку макропроцессор нам не поможет? Используя дополнительный препроцессор. Напишите исходный файл, stringify.c.awk, вот так.
/* stringify.c.awk -- Source file for stringify.c
(Put build instructions here.)
*/
#define QUOTIENT NUMERATOR/DENOMINATOR
#include <stdio.h>
int main(void)
{
printf("QUOTIENT: %d\n", QUOTIENT);
return 0;
}
Запишите вторичный препроцессор в awk. Я сознательно использовал действительно строгое регулярное выражение. Я думаю, что это наиболее вероятное регулярное выражение, если в исходном файле есть изменения, и я думаю, что это обычно то, что вы хотите. (Я обычно хочу препятствовать косметическим изменениям в #define.)
# stringify.awk -- calculate and substitute the value for #define QUOTIENT.
BEGIN {
NUMERATOR = 8;
DENOMINATOR = 2;
}
{
if ($0~/^#define QUOTIENT NUMERATOR\/DENOMINATOR$/) {
sub(/NUMERATOR\/DENOMINATOR/, NUMERATOR/DENOMINATOR);
}
print $0;
}
Теперь вы можете собрать stringify.c из файла stringify.c.awk.
$ awk -f stringify.awk stringify.c.awk > stringify.c
$ gcc -Wall -o stringify stringify.c
$ ./stringify
QUOTIENT: 4
Makefile и щедрые комментарии устраняют большую часть боли.
(m4 не поможет по тем же причинам, что препроцессор C не поможет.)