#define len(a) if (a == 8) 1 \
else if (a == 3) 0 \
else -1
这段代码只是一个例子,我们如何使用嵌套的if else.我不想使用三元操作符,因为在这种情况下,我不能使用 else if语句。
inline __attribute__((always_inline)) int len(const int a)
{
switch(a)
{
case 8: return 1;
case 3: return 0;
}
return -1;
}
不要滥用预处理程序。使用真正的函数。
constexpr auto len(int const a) {
if (a == 8) return 1;
if (a == 3) return 0;
return -1;
}
如果你能使用GNU扩展,并坚持用宏来处理的话 if
-else
分支,您可以使用 复合语句表达式:
#define len(a) ({ \
int _res = -1; \
if ((a) == 8) _res = 1; \
else if ((a) == 3) _res = 0; \
(_res); })
这在C和C++中都适用。不幸的是,这种复合语句不能用于常量表达式。
回复:"我不想使用三元操作符,因为在这种情况下,我不能使用 else if 语句。"我不想使用三元运算符,因为在这种情况下,我不能使用 else if 语句" -- 好吧,是的,你不能使用。else if
的三元运算符。但你可以使用另一个三元运算符。
int x = a == 8 ? 1
: a == 3 ? 0
: -1;
在写嵌套或不写嵌套的时候 if
宏中的语句,或者说至少在你尝试用宏包装语句时不会出现比平时更多的问题。但是请注意,我使用了 声明,没有所谓的 if
在C或C++中,除了你不想使用的三元操作符外,其他的表达式都可以使用。
所以,如果你想使用嵌套的 if
在宏中的语句,你可以做一些类似于
#define stmt(c1, c2) \
if (c1) \
do_1(); \
else if (c2) \
do_2(); \
else \
do_3()
(请注意,转义的方法是在行尾用 \
而不与 /
). 如果你想要一个表达式,你将不得不使用三元运算符或其他答案中显示的函数。好吧,即使你需要语句,我也建议使用函数而不是宏。