定义多个具有相同值的#defines

时间:2013-07-09 19:46:16

标签: c++ c

我有一些我想要#define的东西。这些是IN,OUT,ON,OFF,UP和DOWN。我希望IN,ON和UP为'1',其余为'0'。有没有办法可以做类似的事情:

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

我知道我可以自己#define每个人,但我正在寻找一点紧凑......

编辑:

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

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

我应该澄清我对#define陈述的使用。

5 个答案:

答案 0 :(得分:6)

  

我知道我可以自己#define每个人,但我正在寻找一点紧凑......

不,您需要分别#define每个宏。

宏很简单 - 名字首先出现,而行上的其他内容都是值。只要名称出现,编译器就会将名称替换为名称。

答案 1 :(得分:5)

每行只能#define一项。

但请考虑不要使用#define。一种简单的方法是使用static const s:

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 const更优越,因为匿名命名空间中的任何内容仅在当前翻译单元中有效可见。换句话说,它不会污染全局命名空间。

另一种选择是使用enum s:

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

根据您的使用方式,这可能优于上述两种替代品中的任何一种。例如,您无法获取enum的地址。

答案 2 :(得分:0)

我认为没有办法,即使我有建议反对它,因为你可能会在代码中失去很多可读性。特别是对于定义,您希望明确定义为什么

答案 3 :(得分:0)

不,你不能像那样定义#define。

但是为什么不使用const int。

你可以这样做:

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

无论如何,如果可以的话,应该尝试通过使用const变量来避免#define。

答案 4 :(得分:0)

您无法使用定义执行此操作,但可以使用enum执行此操作。如果可以接受三行,那么无需明确使用01即可使用:

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

这是有效的,因为enum将默认第一个名称具有值0,并且后续名称的值大于之前给出的值(除非明确表示值)用=指定。将相关名称组合在一个enum中是很自然的,因此这提供了额外的可读性好处。

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