1

我有几件事要#define。它们是 IN、OUT、ON、OFF、UP 和 DOWN。我希望 IN、ON 和 UP 为“1”,其余为“0”。有没有办法我可以做类似的事情:

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

我知道我可以在自己的行上#define 每个,但我正在寻找一些紧凑性......

编辑:

感谢所有的回复。这些#defines 的原因是它们用于状态。在我的代码中,我有这样的东西:

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

#define每行只能有一个项目。

但请考虑完全不使用#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
};

这取决于您要如何使用它,这优于或低于上述两种选择中的任何一种。例如,您不能取 a 的地址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 回答
0

你不能用定义来做,但你可以用enum. 如果三行是可以接受的,那么这无需显式使用0and即可工作1

enum { OUT, IN };
enum { OFF, ON };
enum { DOWN, UP };

这是有效的,因为 anenum将默认第一个名称具有 value 0,并且后续名称的值会比它之前的值大 1(除非使用 明确指定值=)。将相关名称组合在一个 中是很自然的enum,因此这提供了额外的可读性优势。

在 C 中,anenum具有int类型,因此其行为将与您的宏版本相同。在 C++ 中,行为也可能相同,因为enum允许将 an 隐式转换为int.

于 2013-07-09T20:05:54.270 回答