2011-07-18 5 views
6

定数cの値を取得する:私は定数の数百人をマクロとして定義されている.hファイル持って

#define C_CONST_NAME Value 

は何が必要なの動的これらの定数のいずれかの値を得ることができる機能です。

必要な機能ヘッダー:

int getConstValue(char * constName); 

はCの関連リンク言語であっても可能ですか?

---- EDIT助けを

おかげで、それは簡単だった:)

私は私のニーズのための奇跡の解決策が存在しないことを考えていたよう。実際に私が使用するヘッダー・ファイルは、「SCADE:http://www.esterel-technologies.com/products/scade-suite/」によって生成される

私は@クリスからもらったソリューションの上

は、作業を行うCコードを生成するために、いくつかのpythonを使用することです。

これで私は一定の名前を見つけるためにいくつかの最適化を行っています。私は5000以上の定数を持っていますO(500^2)

私はまた、 "X-マクロス"を見ています。私はC言語で使用することが許可されていないので、 。

ありがとうございました

+0

定数はプリプロセッサ定数ではなく、オブジェクト空間に移動する必要があります。 [地図](http://en.wikipedia.org/wiki/Map_(C%2B%2B)) –

+1

なぜあなたはこれを行う必要があるのか​​、動的にはできないのかどうかはわかりません。上で定義した '定数'は、実際にはプログラムソースのコンパイル時には存在しません。彼らはそれらの実際の値でプリプロセッサに置き換えられます。 – Perception

+1

定義済みの定数を使用しないでください。 const値を持つ連想配列を使用します。 –

答えて

4

ここに行きます。あなたはそれぞれの新しい定数の行を追加する必要がありますが、それはあなたのマクロがどのように機能するかについてのアイデアを与える必要があります。

#include <stdio.h> 

#define C_TEN 10 
#define C_TWENTY 20 
#define C_THIRTY 30 

#define IFCONST(charstar, define) if(strcmp((charstar), #define) == 0) { \ 
    return (define); \ 
} 

int getConstValue(const char* constName) 
{ 
    IFCONST(constName, C_TEN); 
    IFCONST(constName, C_TWENTY); 
    IFCONST(constName, C_THIRTY); 

    // No match                                                        
    return -1; 
} 

int main(int argc, char **argv) 
{ 
    printf("C_TEN is %d\n", getConstValue("C_TEN")); 

    return 0; 
} 

私はあなたがこのコードで何をするかはgcc見るためにgcc -E filename.cを実行して示唆しています。

6

Cはこれを行うことができません。別の構造体に格納するか、プリプロセッサを使用して必要な数百のif文を作成する必要があります。 Cogflectのようなものが役に立ちました。

3

前処理が完了した後、Cプリプロセッサマクロ(つまり、#define文で指定されたもの)がなくなります。プログラムはそれらのマクロの名前を知っておらず、それらを参照する方法もありません。

あなたが実行しようとしているタスクを教えていただけたら、別の方法を提案することができます。

1

これはX-マクロがために使用されているものです。

https://secure.wikimedia.org/wikipedia/en/wiki/C_preprocessor#X-Macros

しかし、あなたは定数に文字列をマップするために必要がある場合は、文字列表現の配列に文字列を検索する必要があります、 O(n^2)です。

+0

どこからO(n^2)を取得しますか?線形検索を行ったとしても、O(n)しか必要ありません。 std :: mapを使うとこれをO(log n)に減らすことができます。 – zennehoy

+0

@zennehoy OK、それは 'O(n^2)'ではなく、 'O(n * m)'です。文字列の比較は 'O(n)'ではなく 'O(1)'です。 –

+0

初めて "X-Macros"と聞く – azalsup

1

しかし、doxygenのようなツールを使用すると、ソースコードから実行時に読み取ることができるデータ構造にすべて#defineを抽出できます(doxygenはすべてのマクロ定義をXMLに保存できます) )。

+0

私は私のCコードを生成するためにpythonを使うことができます。ありがとう – azalsup

+0

@azalsup:PythonでCコードを生成する代わりに、yacc文法を生成し、yacc(または[GNU Bison](http://www.gnu.org/software/bison/))を実行して高度に最適化されたCコードを生成するマッチングを行う。実際、ツールの 'lex'部分はおそらくあなたが必要とするものです。 –

1

おそらくgperfでこれを行うことができます。これはperfect hash functionを使用するルックアップ関数を生成します。

次のようなファイルを作成し、-tオプションでgperfの実行:

struct constant { char *name; int value; }; 
%% 
C_CONST_NAME1, 1 
C_CONST_NAME2, 2 

gperfの出力C(またはC++)、一定時間内のルックアップを行うコードは、キーへのポインタを返すだろう/値のペア、またはNULL。

キーワードセットがgperfには大きすぎる場合は、代わりにcmphを使用することを検討してください。

関連する問題