Самый простой способ сделать это - использовать специальный сценарий предварительной обработки, который вы можете интегрировать в свой процесс сборки.
Я не знаю, какие инструменты у вас есть, но вы можете легко использовать awk
в качестве препроцессора. Если вы используете make
, вы можете автоматически создать файл c
из скелета: (смотрите ниже оригинального AWK сценария.)
file.c: file.c.in
awk ' \
/^#define X/{ \
for (i = 1; i <= $$3; ++i) \
s = s "\"repr"i"\\0\"" \
} \
match($$0,/*const char \*reprx\[\] = /) { \
$$0 = substr($$0, 1, RLENGTH) s ";" \
} \
1' $^ > [email protected]
Пример:
$ cat file.c.in
/* The beginning of the program */
#define X 7
/* Some part of the program */
const char *reprx[] = "Will be replaced";
/* The rest of the program */
$ make -s file.c
$ cat file.c
/* The beginning of the program */
#define X 7
/* Some part of the program */
const char *reprx[] = "repr1\0""repr2\0""repr3\0""repr4\0""repr5\0""repr6\0""repr7\0";
/* The rest of the program */
Поскольку немного затененная необходимостью избежать знаков доллара и окончаний линии, вот оригинальная программа awk:
awk '/^#define X/{
for (i = 1; i <= $3; ++i)
s = s "\"repr"i"\\0\""
}
match($0,/*const char \*reprx\[\] = /) {
$0 = substr($0, 1, RLENGTH) s ";"
}
1'
Что, с '# define', вы хотите указать это? неясно . – ameyCU
Нет * простой * способ. Вы можете использовать библиотеку макросов предварительной обработки Boost (http://www.boost.org/doc/libs/1_59_0/libs/preprocessor/doc/), но я полагаю, что это считается «дополнительными библиотеками» – rici
Dunno, если это считается «лишняя» библиотека, но m4 могла бы выполнить эту работу: http://www.gnu.org/software/m4/m4.html – Downvoter