ファイルに何かを書き込んで(それを と呼びましょう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
して16進表現をダンプすることは、私にとって「解決策」ではありません。私の現在の方法よりも良くない(つまり、簡単/きれい)。
数年後の更新:
重複としてクローズされたため、この質問に答えることができなかったことに気付きました。この commitを見たときに探していた答えが見つかりました。それ自体は、この記事へのコメントに基づいており、それ以来ずっと使用しています。
簡単に言うと、小さなアセンブリ ファイルには必要なファイルが含まれてNAME
おり、3 つの変数を使用して特定の のNAME_begin
下に公開され、C コードからその内容にアクセスできますNAME_end
。NAME_len
xxd
このように、必要なコードだけを含む通常のファイルがあり、実行時に読み取ったり、フープをジャンプしたりする代わりに、コンパイル時に自動的に読み取られます。