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

时间:2016-08-05 18:18:13

标签: c scope

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

#include <stdint.h>

#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 个答案:

答案 0 :(得分:6)

我不知道“新范围”的含义 - 在C中,“范围”仅与标识符有关,而与对象生命周期无关。每6.5.2.5复合文字,

  

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

因此,如果在函数体内使用此宏,则指向对象的生命周期将持续,直到封闭块的执行结束。这可能会也可能不会满足您的需求;你写错了可能会遇到麻烦:

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