2011-12-27 13 views
0

マクロをこのように使用できるかどうかはわかりません。文字列を使用してマクロ定義を確認する

私の組み込みシステムのプロジェクトでは、私が持っている2つの文字列に応じてマクロが定義されているかどうかを知りたいと思います。例えばのために

:今

#define FAN_1 PORTAbits.RA0 

#define LIGHT_1 PORTAbits.RA1 

、私はの形で要求を取得する:私は、直接私のファン1であることを、ピンをチェックしたいと思いますこれら二つの引数を使用して

char *arg1="FAN"; ("LIGHT") 

char *arg2="1"; 

接続して状態を確認してください。

strcmp()または直接マッチングを使用してarg1とarg2をチェックする必要がないようにしたいです。 そして私は直接if(some_macro(arg1,arg2)==1){} else {}と書くことができます。

ピンがこのようにしか定義できないため、マクロを使用してこれが可能かどうかをご案内します。

また、そうでない場合は、これを行う他の方法はありますか?

+0

これは疑いマイクロチップのPICコードのように見えます。 MPLAB Cコンパイラとライブラリを使用している場合は、RAMとROMの文字列の違いに注意してください。関数に渡される文字列定数は、 'char *'ではなく 'char rom * 'になります。各タイプの文字列比較のためのライブラリには特別な関数があります。たとえば、 'strcmppgm2ram(arg1、" FAN ")'は、arg1を文字列リテラルと比較するのに適しています。私は他のCコンパイラがどのように奇妙なメモリ構造を扱っているのかよく分かりません。 –

答えて

4

いいえ、このようなマクロは使用できません。マクロは、コードがコンパイルされる前にプリプロセッサによって展開されるプリプロセッサ機能です。あなたが受け取ったリクエストは、実行時にしか分かっていないようです。この情報が実行時にしかわからない場合、プリプロセッサ時間にFAN_1またはLIGHT_1の要求かどうかを確認する方法はありません。条件のチェックを使用して、要求の内容を判断する必要があります。

ピンバンク( "FAN"、 "LIGHT"など)の名前によっては、arg1の最初の文字、または最初の数文字をオンにすれば十分でしょう。また、arg2を完全に解析するのではなく、その文字をオンにすることもできます。これにより、strcmp()またはatoi()を呼び出すことなく、要求されているピンを識別することができます。

+0

より包括的な答えである+1を8秒で叩いてください。 –

+0

ダニエルに感謝! arg1の最初の文字に切り替えることはできません。なぜなら、要求が受け入れられるか拒否されるかを検証する必要があるからです。そのためには、私はスペルを完全な "ファン"と "ライト"を確認する必要がありますあなたはarg2について正しいです。 – user1117564

1

Cプリプロセッサは、任意の変数の値にアクセスできません。しかし、あなたは、マクロの代わりに、環境変数を使用することができます。その後、

putenv("FAN_1", "PORTAbits.RA0") 
putenv("LIGHT_1", "PORTAbits.RA1") 

とを:

construct(arg1, arg2)関数は、文字列 arg1"_"、および arg2の連結を返し
if (getenv(construct(arg1, arg2)) != NULL) {} else {} 

+0

この場合、 'construct'はおそらくメモリをリークします。 –

+3

彼はおそらくPICにputenv()やgetenv()を持っていません:)。 –

+0

右Brian ..私はそのようなメソッドを持っていません!あなたはそれを行うための他の方法を提案できますか? – user1117564

関連する問題