della costruzione su idea di teivaz, mi chiedo se il solito "stringize dopo l'espansione" trucco funziona:
#define STRINGIZE(...) #__VA_ARGS__
#define EXPAND_AND_STRINGIZE(...) STRINGIZE(__VA_ARGS__)
constexpr std::string shader_source = EXPAND_AND_STRINGIZE(
#include "~/.foo.glsl"
);
Eppure, andrebbe per una dichiarazione convenzionale extern const char[]
risolta al contenuto dal linker. L'articolo "Embedding a File in an Executable, aka Hello World, Version 5967" ha un esempio:
# objcopy --input binary \
--output elf32-i386 \
--binary-architecture i386 data.txt data.o
Naturalmente è necessario modificare il --output
e --binary-architecture
comandi per abbinare la vostra piattaforma. Il nome file dal file oggetto finisce nel nome del simbolo, quindi puoi usarlo in questo modo:
#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++);
}
fonte
2014-10-02 13:14:04
Dipende da cosa si svezza per * caricare *. L'unica soluzione che conosco è '# include', e significa che il contenuto del file deve essere compreso dal compilatore. –
Ciò che si desidera è una dichiarazione di variabile esterna, che verrà abbinata ai dati effettivi dal linker. Combina questo con uno strumento che incorpora una risorsa binaria arbitraria in un file oggetto con un simbolo esportato di tua scelta, e sei d'oro. (Potrei suggerire un tale strumento, ma non hai menzionato quale toolchain stai usando, e gli strumenti sono diversi per i formati di file oggetto ELF vs CV vs PE vs.out) Nota che convertire la risorsa in codice C/C++ come un array costante inizializzato con letterali esadecimali è molto lento, quindi vai direttamente al file oggetto. –
Non posso credere che la funzione 'load' sia un' constexpr'. Quindi l'espressione completa non può essere constexpr. Non ho idea di come un contenuto di file esterno possa essere una stringa di constexpr.L'unico modo è utilizzare uno strumento che carica il file e genera codice c/C++. – Klaus