1

#定義したいことがいくつかあります。それらは、IN、OUT、ON、OFF、UP、および DOWN です。IN、ON、UP を「1」にして残りを「0」にしたい。これに似たことができる方法はありますか:

#define IN, ON, UP        1
#define OUT, OFF, DOWN    0

それぞれを独自の行で #define できることはわかっていますが、少しコンパクトにしたい...

編集:

すべての応答に感謝します。#defineこれらの sの理由は、それらが状態用であるためです。私のコードには、次のようなものがあります。

TRISBbits.TRISB5 = IN; if(PORTBbits.RB10 == ON)if(condition){someFlag = UP;}

#defineステートメントの使用法を明確にする必要がありました。

4

5 に答える 5

6

それぞれを独自の行で #define できることはわかっていますが、少しコンパクトにしたい...

いいえ、各マクロを個別に #define する必要があります。

マクロは非常に単純です。名前が最初に来て、それ以外の行にあるものが値です。コンパイラは、名前が表示される場所に名前の値を置き換えるだけです。

于 2013-07-09T19:47:55.393 に答える
5

#define1 行に 1 項目のみ指定できます。

ただし、#defines をまったく使用しないことを検討してください。単純なアプローチは、static consts を使用することです。

static const bool In = true, On = true, Up = true;
static const bool Out = false, Off = false, Down = false;

より良いアプローチは、これらを無名でアウトすることnamespaceです:

namespace
{
    const bool
        In = true,
        On = true,
        Up = true,
        Out = false,
        Off = false,
        Down = false;
};     

これはstatic consts よりも優れています。これは、匿名の名前空間にあるものはすべて、現在の翻訳単位でのみ効果的に表示されるためです。つまり、グローバル名前空間を汚染しません。

別の方法は、enums を使用することです。

enum
{
  In = 1,
  On = 1,
  Up = 1,
  Out = 0,
  Off = 0,
  Down = 0
};

これは、使用方法に応じて、上記の 2 つの選択肢のいずれかよりも優れているか劣っています。enumたとえば、のアドレスを取得することはできません。

于 2013-07-09T19:49:53.233 に答える
0

方法はないと思います。たとえあったとしても、これを使用するとコードの可読性が大幅に失われる可能性があるため、お勧めしません。特に定義では、何が何として定義されているかを明確にしたい

于 2013-07-09T19:49:01.247 に答える
0

いいえ、#define をそのように定義することはできません。

しかし、const int を使用しないのはなぜですか。

次のようなことができます:

static const int IN=1,ON=1,OP=1;
static const int OUT=0,OFF=0,DOWN=0;

いずれにしても、const 変数を使用して、可能であれば #define を回避するようにしてください。

于 2013-07-09T19:54:29.790 に答える