C/C++ では、ファイルを文字列リテラルに #include できますか?[重複]
-
12-09-2019 - |
質問
この質問にはすでに答えがあります:
C++ ソース ファイルと Python ソース ファイルがあります。C++ ソース ファイルで Python ソース ファイルの内容を大きな文字列リテラルとして使用できるようにしたいと考えています。次のようなことができます:
char* python_code = "
#include "script.py"
"
ただし、各行の末尾に \ が必要なため、これは機能しません。Python コードの内容を手動でコピーして貼り付け、各行を引用符と終了 で囲むこともできますが、これは見苦しいです。Python ソースは効果的に C++ アプリにコンパイルされることになりますが、別のファイルに保存しておきたいと思います。その理由は、Python ソースのほうが整理されており、エディターでより適切に動作するためです (emacs はそれを認識できるほど賢くありません)。 C 文字列リテラルは Python コードであり、その中にいる間は Python モードに切り替えます)。
PyRun_File の使用を提案しないでください。それは私が最初から避けようとしているものです ;)
解決
のトークン単位のC / C ++プリプロセッサが作用し、文字列リテラルは、単一ののトークンです。そのように、あなたはそのような文字列リテラルの途中に介入することはできません。
あなたは前処理のようなものにscript.py可能性があります:
"some code\n"
"some more code that will be appended\n"
とそのの#include、しかし。それとも、包含のための準備ができてCの静的配列を生成するために xxd
の -i
を使用することができます。
他のヒント
このはあなたにそこにすべての方法を得ることはありませんが、それはあなたがかなり気に近いでしょう。
と仮定すると、script.py
この含まれています:
print "The current CPU time in seconds is: ", time.clock()
まず、このようにそれを包むます:
STRINGIFY(print "The current CPU time in seconds is: ", time.clock())
次に、あなたはそれを含める直前に、次の操作を行います。
#define STRINGIFY(x) #x
const char * script_py =
#include "script.py"
;
は、おそらくそれよりも、タイトな答えがあるのですが、私はまだ探しています。
このようなことを行うための最良の方法は、環境/ツールセットにその機能がある場合、ファイルをリソースとして含めることです。
そうでない場合 (組み込みシステムなど)、bin2c ユーティリティ (次のようなもの) を使用できます。 http://stud3.tuwien.ac.at/~e0025274/bin2c/bin2c.c)。ファイルのバイナリ表現を取得し、そのデータに初期化されたバイト配列を含む C ソース ファイルを吐き出します。配列を '\0' で終了させる場合は、ツールまたは出力ファイルを微調整する必要がある場合があります。
bin2c ユーティリティの実行をメイクファイルに組み込みます (または、ビルドの実行に使用しているもののプレビルド ステップとして)。次に、ファイルをコンパイルしてアプリケーションにリンクするだけで、配列で表されるメモリのチャンクに文字列 (またはファイルの他のイメージ) が格納されます。
テキスト ファイルを文字列として含める場合、注意すべき点の 1 つは、行末が関数が期待するものと一致しない可能性があるということです。これは、bin2c ユーティリティに追加する必要がある別の項目であるか、または必要になる可能性があります。ファイル内の行末がすべてコードで適切に処理されることを確認します。おそらく bin2c ユーティリティを変更して、テキスト ファイルを文字列として組み込むことを示す '-s' スイッチを追加すると、行末が正規化され、配列の末尾にゼロ バイトが配置されます。
あなたはそれに表示されるすべての二重引用符、バックスラッシュ、トリグラフ、そしておそらく他のもの、に対処するために、Pythonコードに独自の処理の一部を行う必要があるとしています。あなたは、同時に\ nのに改行を回す(またはそれらをバックスラッシュ・エスケープ)と、両端に二重引用符を追加することができます。結果は、Pythonのソースファイルから生成されたヘッダファイルは、することができ、その後の#includeになります。あなたはまだPythonなどのPythonソースを編集できるように、これを自動化するビルドプロセスを使用します。
あなたは前処理を行うことと埋め込むために(ビルドプロセスの一環として、コグに使用することができますコード)。私は、あなたが両方の場所でコードを見てしまうので、この結果は、おそらく理想的ではないことを認めています。しかし、私はcloss近くに「パイソン」「C ++」、および「プリプロセッサ」を参照してください。いつでも、私はそれが言及に値すると感じています。
ここでは、
cmd.exeをして変換を自動化する方法であります------ html2h.bat ------
@echo off
echo const char * html_page = "\
sed "/.*/ s/$/ \\n\\/" ../src/page.html | sed s/\"/\\\x22/g
echo.
echo ";
これは、同様に呼ばれていました。
cmd /c "..\Debug\html2h.bat" > "..\debug\src\html.h"
と
によりコードに取り付けられ#include "../Debug/src/html.h"
printf("%s\n", html_page);
これは、人々のほとんどのように、私は進ダンプを嫌い、かなりシステムに依存したアプローチですが。
fopen
、getline
、およびfclose
を使用します。