Конкатенация строк с использованием прекомпилятора - PullRequest
0 голосов
/ 17 января 2009

У меня следующая проблема. Я хочу включить многострочный текстовый файл как #define, то есть мне нужна константа, которая хранит значение текстового файла. Пример:

File 'f.txt': This\nis\n\nsome\ntext

и я хочу инициализировать константу (во время компиляции) в стиле

#define txtfile "This\\nis\\na\\ntextfile"

где строка "This \ nis \ na \ ntextfile" получается путем объединения строк в файле f.txt. Есть ли способ достичь этого, используя команды препроцессора / макросы?

Ответы [ 4 ]

2 голосов
/ 17 января 2009

Взгляните на "# include" текстовый файл в программе на C в виде символа [] для возможной альтернативы, которая может удовлетворить ваши потребности.

1 голос
/ 17 января 2009

Это не возможно напрямую, так как текстовый файл должен быть обработан в первую очередь. Вы могли бы написать довольно простой скрипт, который выполнял бы соответствующее экранирование и добавил #define, создавая подходящий заголовочный файл.

Как правило, текстовый файл на самом деле не нужен как расширение макроса препроцессора, однако вам необходимо, чтобы данные файла отображались в объектном файле и были доступны, как если бы они были extern char[].

Для этого есть два подхода. Облегченный способ заключается в использовании ассемблера типа yasm с директивой incbin для создания объектного файла, в котором данные файла представлены в виде помеченного раздела. e.g.:

    global f_txt
f_txt:
    incbin "f.txt"

Затем в файле C вы можете объявить:

extern char f_txt[];

Более переносимый способ - использовать утилиту наподобие xxd -i для преобразования данных в файл C с массивом char, записанным как 'long hand'.

0 голосов
/ 17 января 2009

Что вам, вероятно, придется сделать, - это иметь отдельную программу препроцессора, которая берет ваш входной файл (f.txt) и фрагмент кода в вашем специальном исходном файле (program.cppx), например:

#superdefine txtfile f.txt

Предварительный препроцессор, который вам придется написать самостоятельно, но он в основном заменит строки #superdefine эквивалентными #define строками в зависимости от содержимого файла, создав файл program.cpp, который вы затем сможете подача в настоящий компилятор.

Это довольно легко сделать в UNIX, если вы используете make-вариант. Может быть не так просто использовать IDE.

0 голосов
/ 17 января 2009

Можно прийти с такой идеей:

f.txt:

This \
is \
some \
text \

code.c:

#define txtfile "\
#include "f.txt"
"

Но я не думаю, что это сработает. Строка включения будет считаться строкой.

...