2017-09-15 13 views
-1

私が行う必要があるのは、プログラムの残りの部分とともにコンパイルする必要がある定数値を「微調整」することですが、変更するごとに結果を確認する必要があります毎回値を取得し、プログラム全体を再コンパイルします。だから私はある種のプレーンテキスト設定ファイルを考えて、その中の数値を変更するたびにリロードし、プログラムの一部を再初期化して新しい値を処理します。それは私が頻繁に行う何かが、私は何をしたいのか、この時間は、次の構文を使用して、有効なインクルージョンファイルの形でこの設定ファイルを持っていることです。実行時にインクルードファイルを評価するC++

const MyStructure[] = 
{ 
    { 1, 0.5f, 0.2f, 0.77f, [other values...] }, 
    { 3, 0.4f, 0.1f, 0.15f, [other values...] }, 
    [other rows...] 
}; 

私のようなインタプリタ言語を使用していた場合Perl、私はeval()関数を使用していましたが、もちろんC++では不可能です。そして、私がC++でeval()関数を持つ可能性について他の質問を読んだが、私が望むのは、このコードを評価し実行することではなく、それを解析し、それらが属する変数に値を入れることです。

私は上記のC構文を解析するために正規表現を使用しますが、RegExpはまだC++で使用する価値がないので、別の方法を提案できますか?

開発段階でのみこのファイルを解析する必要があります。私は#includeそのプログラムがリリースの準備ができているときにそれを行います。

+0

通常のファイルからのデータを 'コンス'変数にロードするだけです。あなたは「この変数は 'const'ですが時にはそれが変化します」から何も得られません。 – nwp

+0

なぜデータファイルを持っていないのですか? – KonstantinL

+0

私は英語が私の母親ではないということを知っていますが、開発段階でこのファイルを変更する必要があると私は言っていましたが、投稿がはっきりしないとは思わない。プログラムが完了すると、そのデータは一定のままで、もはやそれ以上変わらない必要があります。これ以上変更する必要のないデータファイルを持つことに意味はありません。私の主な目標は、開発プロセスをスピードアップして、データ構造内の何かを変更する必要があるたびにプログラム全体を再コンパイルすることを避けることでした。 –

答えて

0

あなた自身のパーサーを書くことは、おそらくこのユースケースに適しているよりも多くの作業です。

より簡単な解決策は、実行時に動的にロードできる共有オブジェクトまたはDLLとして、変数を個別に含むファイルをコンパイルすることです。 (正確な詳細はお使いのOSによって異なります)。必要に応じて、プログラムの初期化中にコンパイラを起動することもできます。

記号を見つけて静的変数にコピーするという複雑さに対処したくない場合は、プログラムの大半を共有オブジェクトとしてコンパイルし、主な実行可能ファイルとしてシムだけをコンパイルすることもできます。そのシムは、希望:

  • 必要に応じて、動的動的プログラム共有オブジェクトをロードし、

  • データ共有オブジェクト

  • をロードし、データ共有オブジェクト

  • を作成するには、コンパイラを呼び出します

  • メインプログラムを呼び出すには、mainエントリポイント(場合によっては別の名前を使用)を使用します。

生産バージョンを作成するには、プログラムとデータを一緒にコンパイルし、シムなしで直接使用する必要があります。

このテーマのバリエーションは、正確なニーズに応じて可能です。

関連する問題