我们如何使用嵌套的if else与#define预处理程序

问题描述 投票:0回答:2
#define len(a) if (a == 8)   1       \
               else if (a == 3) 0    \
               else -1

这段代码只是一个例子,我们如何使用嵌套的if else.我不想使用三元操作符,因为在这种情况下,我不能使用 else if语句。

c++ c c-preprocessor
2个回答
1
投票
inline __attribute__((always_inline)) int len(const int a)
{
    switch(a)
    {
        case 8: return 1;
        case 3: return 0;
    }
    return -1;
}

6
投票

不要滥用预处理程序。使用真正的函数。

constexpr auto len(int const a) {
    if (a == 8) return 1;
    if (a == 3) return 0;
    return -1;
}

0
投票

如果你能使用GNU扩展,并坚持用宏来处理的话 if-else 分支,您可以使用 复合语句表达式:

#define len(a) ({                 \
    int _res = -1;                \
    if ((a) == 8) _res = 1;       \
    else if ((a) == 3) _res = 0;  \
    (_res); })

这在C和C++中都适用。不幸的是,这种复合语句不能用于常量表达式。


0
投票

回复:"我不想使用三元操作符,因为在这种情况下,我不能使用 else if 语句。"我不想使用三元运算符,因为在这种情况下,我不能使用 else if 语句" -- 好吧,是的,你不能使用。else if 的三元运算符。但你可以使用另一个三元运算符。

int x = a == 8 ? 1
    : a == 3 ? 0
    : -1;

-2
投票

在写嵌套或不写嵌套的时候 if 宏中的语句,或者说至少在你尝试用宏包装语句时不会出现比平时更多的问题。但是请注意,我使用了 声明,没有所谓的 if 在C或C++中,除了你不想使用的三元操作符外,其他的表达式都可以使用。

所以,如果你想使用嵌套的 if在宏中的语句,你可以做一些类似于

#define stmt(c1, c2) \
   if (c1) \
      do_1(); \
   else if (c2) \
      do_2(); \
   else \
      do_3()

(请注意,转义的方法是在行尾用 \ 而不与 /). 如果你想要一个表达式,你将不得不使用三元运算符或其他答案中显示的函数。好吧,即使你需要语句,我也建议使用函数而不是宏。

© www.soinside.com 2019 - 2024. All rights reserved.