Vorrei scrivere qualcosa in un file (chiamiamolo foo.cpp
) e comprendono come una stringa nel mio programma al momento della compilazione, simile al modo #include
lo faLeggere un file in una stringa al momento della compilazione
In questo momento sto usando questo C preprocessore #define
:
#define toString(src) #src
per convertire un mucchio di codice in una stringa, usato come in questo esempio:
const char* str = toString(
int x;
void main(){}
);
Si può leggere su macro stringificazione there se vuoi.
Mi piacerebbe spostare quel codice su un file esterno, che sarebbe "collegato" in fase di compilazione. Non voglio che il file debba essere distribuito con il programma, il che sarebbe il caso se dovessi leggerlo in fase di esecuzione.
Ho cercato di usare una direttiva #include
come mostrato di seguito, ma il compilatore rifiutato esso:
const char* str = toString(
#include "foo.cpp"
);
g++
sembra essere completamente confuso, ma clang++
mi ha dato questo errore:
error: embedding a #include directive within macro arguments is not supported
Qualcuno sa se/come questo può essere fatto?
Nota: lo sto utilizzando per scrivere i miei shader GLSL, anche se dubito che questa informazione sia di qualche utilità.
PS: Prima mi dici che questo è un duplicato di this question, mettendo il mio codice in una stringa gigante in un file o utilizzando uno strumento esterno (es. xxd
) per scaricare il suo rappresentazione esadecimale non sono "soluzioni" per me, poiché non sono migliori (cioè più facili/più puliti) del mio attuale metodo.
Update, qualche anno più tardi:
Ho appena realizzato che non ho mai avuto modo di rispondere a questa domanda perché era chiuso come duplicato. Ho trovato la risposta che stavo cercando quando ho visto this commit, a sua volta basato su a comment on this article, e lo sto usando da allora.
In poche parole, un file di assieme piccola include i file che vuoi e li espone in un dato NAME
, con le tre variabili NAME_begin
, NAME_end
e NAME_len
che consente di accedere ai propri contenuti dal codice C.
In questo modo, si dispone di un file normale che non contiene nient'altro che il codice che si desidera e viene letto automaticamente in fase di compilazione, anziché doverlo leggere in fase di esecuzione o saltare attraverso i cerchi xxd
.
È un duplicato della domanda collegata. Semplicemente non ti piacciono le risposte fornite. Ma la risposta è che non puoi farlo nel modo in cui vuoi farlo, quindi avrai solo un mucchio di risposte che rispecchiano le risposte della domanda collegata. – rici
Che piattaforma stai tentando di compilare per ... o stai tentando di renderlo multipiattaforma? –
Sto cercando di capire come i termini "migliore", "più facile" e "più pulito" si applicano al * questo * metodo, molto meno a qualsiasi altro. Solo per la comprensione, si desidera eseguire il preprocesso di un set di stringhe a livello di origine delle stringhe che vengono poi scritte su un file utilizzando un codice non ancora visualizzato, quindi compilare successivamente detto file dall'origine e il problema che si sta verificando è incorporare le istruzioni del preprocessore nella "fonte" del passaggio 1? – WhozCraig