我有一些我想要#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
陈述的使用。
答案 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
执行此操作。如果可以接受三行,那么无需明确使用0
和1
即可使用:
enum { OUT, IN };
enum { OFF, ON };
enum { DOWN, UP };
这是有效的,因为enum
将默认第一个名称具有值0
,并且后续名称的值大于之前给出的值(除非明确表示值)用=
指定。将相关名称组合在一个enum
中是很自然的,因此这提供了额外的可读性好处。
在C中,enum
具有int
类型,因此其行为将与您的宏版本相同。在C ++中,行为也可能是相同的,因为允许enum
隐式转换为int
。