在if语句中声明变量(ANSI C)

zengzsys  于 2023-03-29  发布在  其他
关注(0)|答案(2)|浏览(94)

有没有办法在***if语句***中声明变量(仅限***ANSI C***)?

示例:

if(int variable = some_function())
{
    return 1;
}
rekjcdws

rekjcdws1#

不你不能这么做
您可以为if创建一个复合语句(anonymoushanging

{
        int variable;
        variable = some_function();
        if (variable) return 1;
    }
    /* variable is out of scope here */

注意,对于这种简单的情况,您可以调用函数作为if的条件(不需要额外的变量)。

if (some_function()) return 1;
pepwfjgg

pepwfjgg2#

GCC extension开始:
括号中的复合语句在GNU C中可以作为表达式出现。这允许您在表达式中使用循环,开关和局部变量。回想一下,复合语句是由大括号包围的语句序列;在这个结构中,圆括号围绕着大括号。例如:

({ int y = foo (); int z;
   if (y > 0) z = y;
   else z = - y;
   z; })

foo ()绝对值的有效表达式(尽管比必要的稍微复杂一些)。

复合语句中的最后一件事应该是一个表达式,后面跟着一个分号;这个子表达式的值作为整个构造的值。(如果你在大括号中最后使用其他类型的语句,则该构造的类型为void,因此实际上没有值。

简化示例:

#include <stdio.h>
    
int main()
{
    if (({int a = 1; a;}))
        printf("Hello World: TRUE");
    else
        printf("Hello World: FALSE");

    return 0;
}

// output:
// Hello World: TRUE

#include <stdio.h>

int main()
{
    if (({int a = 0; a;}))
        printf("Hello World: TRUE");
    else
        printf("Hello World: FALSE");

    return 0;
}
// output:
// Hello World: FALSE

真的有人这样使用它吗?是的!据我所知,Linux内核通过这个扩展简化了代码。

/* SPDX-License-Identifier: GPL-2.0-only */
#define __get_user(x, ptr)                      \
({                                  \
    int __gu_err = 0;                       \
    __get_user_error((x), (ptr), __gu_err);             \
    __gu_err;                           \
})

#define unsafe_op_wrap(op, err) do { if (unlikely(op)) goto err; } while (0)
#define unsafe_get_user(x,p,e) unsafe_op_wrap(__get_user(x,p),e)

https://elixir.bootlin.com/linux/latest/source/include/linux/uaccess.h#L365

相关问题