Если вы готовы прибегнуть к некоторым грязным трюкам, вы можете проявить творческий подход к необработанным строковым литералам и #include
для определенных типов файлов.
Например, скажем, я хочу включить некоторые сценарии SQL для SQLite в свой проект и хочу получить подсветку синтаксиса, но не хочу никакой специальной инфраструктуры сборки. Я могу иметь этот файл test.sql
, который является допустимым SQL для SQLite, где --
начинает комментарий:
--x, R"(--
SELECT * from TestTable
WHERE field = 5
--)"
И тогда в моем коде C ++ я могу иметь:
int main()
{
auto x = 0;
const char* mysql = (
#include "test.sql"
);
cout << mysql << endl;
}
Вывод:
--
SELECT * from TestTable
WHERE field = 5
--
Или включить некоторый код Python из файла test.py
, который является допустимым скриптом Python (потому что #
запускает комментарий в Python, а pass
- это запрет):
#define pass R"(
pass
def myfunc():
print("Some Python code")
myfunc()
#undef pass
#define pass )"
pass
А затем в коде C ++:
int main()
{
const char* mypython = (
#include "test.py"
);
cout << mypython << endl;
}
Который выдаст:
pass
def myfunc():
print("Some Python code")
myfunc()
#undef pass
#define pass
Должна быть возможность воспроизводить подобные трюки для различных других типов кода, которые вы, возможно, захотите включить в виде строки. Является ли это хорошей идеей, я не уверен. Это что-то вроде аккуратного хака, но, вероятно, это не то, что вам нужно в реальном производственном коде. Возможно, все будет хорошо для хакерского проекта на выходных.