0

次の問題があります。複数行のテキスト ファイルを としてインクルードしたい#define、つまり、テキスト ファイルの値を格納する定数が必要です。例:

File 'f.txt': This\nis\n\nsome\ntext

そして、(コンパイル時に)定数を次のスタイルで初期化したい

#define txtfile "This\\nis\\na\\ntextfile"

ここで、文字列 "This\nis\na\ntextfile" は、ファイル f.txt の行を連結して得られます。プリプロセッサ コマンド/マクロを使用してこれを達成する方法はありますか?

4

4 に答える 4

2

C プログラムのテキスト ファイルを char[] として "#include" して、ニーズに対応できる可能性のある代替手段を確認してください。

于 2009-01-17T10:53:37.343 に答える
1

テキストファイルを最初に処理する必要があるため、これを直接行うことはできません。適切なエスケープを実行し、適切#defineなヘッダー ファイルの作成を追加する、かなり単純なスクリプトを作成できます。

通常、実際にはプリプロセッサ マクロ展開としてテキスト ファイルは必要ありませんが、ファイル データがオブジェクト ファイルに表示され、extern char[].

これを行うには、2 つのアプローチがあります。軽量な方法は、yasm のようなアセンブラをincbinディレクティブとともに使用して、ファイル データをラベル付きセクションとして持つオブジェクト ファイルを生成することです。例えば:

    global f_txt
f_txt:
    incbin "f.txt"

次に、C ファイルで次のように宣言できます。

extern char f_txt[];

より移植性の高い方法は、データを C ファイルに変換するなどのユーティリティを使用xxd -iして、char 配列を「ロングハンド」で書き出すことです。

于 2009-01-17T10:56:22.517 に答える
0

おそらくあなたがしなければならないことは、次のような入力ファイル ( ) と特別なソース ファイル ( )f.txtのコード セクションを受け取る別のプリプロセッサ プログラムを用意することです。program.cppx

#superdefine txtfile f.txt

プリプリプロセッサは自分で作成する必要がありますが、基本的にはファイルの内容に基づいて行を#superdefine同等の行に置き換え、実際のコンパイラにフィードできるファイルを生成します。#defineprogram.cpp

make バリアントを使用している場合、これは UNIX で非常に簡単に実現できます。IDE を使用するのは簡単ではないかもしれません。

于 2009-01-17T10:57:28.253 に答える
-1

次のようなアイデアが浮かぶかもしれません。

f.txt:

これ \
は \
いくつか \
文章 \

code.c:

#txtファイルを定義する "\
#include "f.txt"
"

しかし、これはうまくいかないと思います。インクルード行は単に文字列と見なされます。

于 2009-01-17T10:53:06.907 に答える