当前位置:  开发笔记 > 编程语言 > 正文

C的三元条件运算符是否创建了新的范围?

如何解决《C的三元条件运算符是否创建了新的范围?》经验,为你挑选了1个好方法。

标题基本上都说明了一切,但我特别感兴趣的是知道是否应该使用以下(略微滥用)宏(使用C99或更高版本),也就是说,它将返回指向已分配的堆栈的有效部分的指针内存基于表达式的大小:

#include 

#define NASTY(expr) ( \
    8 == sizeof(expr) ? (void *)(&(uint64_t){(expr)}) : \
    ( \
        4 == sizeof(expr) ? (void *)(&(uint32_t){(expr)}) : \
        ( \
            2 == sizeof(expr) ? (void *)(&(uint16_t){(expr)}) : (void *)(&(uint8_t){(expr)}) \
        ) \
    ) \
)

编辑:

我对这样一个宏感兴趣的原因是(1)我是一个书呆子和(2)我正在为需要动态memcpy表达式结果的嵌入式应用程序编写一些代码生成宏(例如x*y+z).我们正在一个能量敏感的应用程序中,函数调用很重要.



1> R....:

我不知道你所说的"一个新的范围"的意思 - 在C,"范围"是只与标识符,而不是对象的生存期.每6.5.2.5复合文字,

如果复合文字出现在函数体外,则该对象具有静态存储持续时间; 否则,它具有与封闭块相关的自动存储持续时间.

因此,如果使用该宏功能体内部,的寿命被指向的对象将持续,直到封闭块的执行结束.这可能会也可能不会满足您的需求; 你写错了可能会遇到麻烦:

if (foo) {
    p = NASTY(bar);
}
/* ... */
/* Do something with p */

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有