Opierając się na idei teivaz jest, zastanawiam się, czy zwykłe "stringize po rozszerzeniu" sztuczka zadziała:
#define STRINGIZE(...) #__VA_ARGS__
#define EXPAND_AND_STRINGIZE(...) STRINGIZE(__VA_ARGS__)
constexpr std::string shader_source = EXPAND_AND_STRINGIZE(
#include "~/.foo.glsl"
);
Nadal, pójdzie na konwencjonalną deklarację extern const char[]
rozwiązaną na zawartość przez linker. W artykule "Embedding a File in an Executable, aka Hello World, Version 5967" ma przykład:
# objcopy --input binary \
--output elf32-i386 \
--binary-architecture i386 data.txt data.o
Naturalnie należy zmienić --output
i --binary-architecture
polecenia, aby dopasować swoją platformę. Nazwa pliku z pliku obiektu kończy się na nazwie symbolu, więc możesz go użyć tak:
#include <stdio.h>
/* here "data" comes from the filename data.o */
extern "C" char _binary_data_txt_start;
extern "C" char _binary_data_txt_end;
main()
{
char* p = &_binary_data_txt_start;
while (p != &_binary_data_txt_end) putchar(*p++);
}
To zależy od tego, co odmieniasz przez * obciążenie *. Jedyne znane mi rozwiązanie to '# include', a to oznacza, że zawartość pliku musi być zrozumiana przez kompilator. –
Najprawdopodobniej jest to zewnętrzna deklaracja zmiennej, która zostanie dopasowana do rzeczywistych danych przez linker. Połącz to z narzędziem, które osadza arbitralny zasób binarny w pliku obiektowym z wyeksportowanym symbolem do wyboru i jesteś złoty. (Mogłabym zasugerować takie narzędzie, ale nie wspomniałeś o tym, którego toolchain używasz, a narzędzia są inne dla ELF vs CV vs PE vs a.out formatów plików obiektów) Zwróć uwagę, że konwersję zasobu na kod C/C++ jako stała tablica zainicjowana za pomocą szesnastkowych literałów prawdopodobnie będzie bardzo powolna, więc przejdź bezpośrednio do pliku obiektu. –
Nie mogę uwierzyć, że twoja funkcja 'load' jest' constexpr'. Tak więc pełne wyrażenie nie może być constexpr. Nie mam pojęcia, jak zewnętrzna zawartość pliku może być ciągiem constexpr.Jedynym sposobem jest użycie narzędzia, które proste ładuje plik i generuje kod c/C++. – Klaus