标题基本上都说明了一切,但我特别感兴趣的是知道是否应该使用以下(略微滥用)宏(使用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
).我们正在一个能量敏感的应用程序中,函数调用很重要.
我不知道你所说的"一个新的范围"的意思 - 在C,"范围"是只与标识符,而不是对象的生存期.每6.5.2.5复合文字,
如果复合文字出现在函数体外,则该对象具有静态存储持续时间; 否则,它具有与封闭块相关的自动存储持续时间.
因此,如果使用该宏功能体内部,的寿命被指向的对象将持续,直到封闭块的执行结束.这可能会也可能不会满足您的需求; 你写错了可能会遇到麻烦:
if (foo) { p = NASTY(bar); } /* ... */ /* Do something with p */