Я хотел бы написать что-то в файле (назовите его foo.cpp
) и включить его как строку в мою программу во время компиляции, аналогично тому, как это делает #include
.
Сейчас я использую этот препроцессор C #define
:
#define toString(src) #src
чтобы преобразовать связку кода в строку, используемую как в этом примере:
const char* str = toString(
int x;
void main(){}
);
Вы можете прочитать о макроснижении там, если хотите.
Я хотел бы переместить этот код во внешний файл, который будет "связан" во время компиляции. Я не хочу, чтобы файл должен был быть распространен вместе с программой, что было бы, если бы я прочитал его во время выполнения.
Я попытался использовать директиву #include
, как показано ниже, но компилятор отказался:
const char* str = toString(
#include "foo.cpp"
);
g++
кажется полностью запутанным, но clang++
дал мне эту ошибку:
error: embedding a #include directive within macro arguments is not supported
Кто-нибудь знает, если/как это можно сделать?
Примечание. Я использую это, чтобы написать мои шейдеры GLSL, хотя я сомневаюсь, что эта информация может быть использована.
PS: Прежде чем вы скажете мне, что это дубликат этого вопроса, поместив мой код в гигантскую строку в свой собственный файл или используя внешний инструмент (например. xxd
), чтобы сбрасывать его шестнадцатеричное представление, для меня не являются "решениями", поскольку они не лучше (т.е. проще/чище), чем мой текущий метод.
Обновление, через несколько лет:
Я просто понял, что мне никогда не приходилось отвечать на этот вопрос, поскольку он был закрыт как дубликат.
Я нашел ответ, который я искал, когда увидел этот коммит, сам по себе комментарий к этой статье и использовали его с тех пор.
В двух словах небольшой файл сборки содержит нужные вам файлы и предоставляет их под заданным NAME
, причем три переменные NAME_begin
, NAME_end
и NAME_len
позволяют вам получить доступ к их содержимому с вашего C код.
Таким образом, у вас есть обычный файл, содержащий ничего, кроме нужного вам кода, и он автоматически считывается во время компиляции, вместо того, чтобы читать его во время выполнения или переходить через xxd
обручи.