コンパイル時に文字列にファイルを読み込み、道に似たコンパイル時、で私のプログラムに文字列としてそれを含める#include
それを行います。</em>(のは<code>foo.cpp</code>それを呼びましょう)私は、ファイル<em>で何かを書きたい
今、私はこのCプリプロセッサ#define
使用しています。この例のように使用する文字列にコードの束を変換する
#define toString(src) #src
を:
const char* str = toString(
int x;
void main(){}
);
あなたはマクロについて読むことができますあなたが望むならば、ストリング化there。
私はこのコードをコンパイル時に "リンク"される外部ファイルに移動したいと思います。 ファイルをプログラムと一緒に配布する必要はありません。実行時に読み込む場合にはそうです。
は、私は以下に示すように#include
ディレクティブを使用しようとしましたが、コンパイラはそれを拒否した:
const char* str = toString(
#include "foo.cpp"
);
g++
は完全に混乱しているようだが、clang++
は私に、このエラーが発生しました:
error: embedding a #include directive within macro arguments is not supported
これを行うことができるかどうか誰にも分かりますか?
注:私はこの情報が何らかの用途に使用されているとは考えていますが、これを使用してGLSLシェーダーを作成しています。
PS:(。例えばxxd
)あなたは、これは、独自のファイルに巨大な文字列で私のコードを入れて、this questionの複製であるか、外部ツールを使用して教えてくださいする前にその16進数表現をダンプするには、「解決策」ではありません私のために、私の現在の方法よりも優れていない(すなわち、より簡単で清潔な)ので。
数年後に更新、:
私はちょうど私がそれを重複として閉鎖されたとして、この質問に答えるためにやったことがなかった実現。 a comment on this articleに基づいて、私がthis commitを見て、それ以来それを使用していたときに私が探していた答えが見つかりました。一言で言えば
、小さなアセンブリファイルは、あなたがしたいファイルが含まれており、三つの変数NAME_begin
、NAME_end
とNAME_len
は、あなたのCコードからその内容にアクセスできるようにして、与えられたNAME
の下でそれらを公開します。
この方法では、必要なコードだけを含む通常のファイルがあり、実行時に読み込むか、xxd
のフープをジャンプする必要はなく、コンパイル時に自動的に読み込まれます。
リンクされた質問の複製です。あなたは提供された回答のどれも好きではありません。しかし答えは、あなたがそれをやりたいやり方で行うことができないということです。そのため、リンクされた質問の答えを反映するたくさんの回答を得るだけです。 – rici
どのプラットフォームをコンパイルしようとしていますか...それともクロスプラットフォームにしようとしていますか? –
私は、「より良い」、「より簡単な」、「よりクリーンな」という用語が* this *メソッドにどのように適用されるかを見極めようとしています。理解のためだけに、ソースレベルの変数セットに前処理して、目に見えないコードを使用してファイルに書き込んだ後、ソースからそのファイルをコンパイルして、問題が発生しているステップ1の "ソース"にプリプロセッサステートメントを埋め込む? – WhozCraig