Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C';s三元条件运算符是否创建新范围?_C_Scope - Fatal编程技术网

C';s三元条件运算符是否创建新范围?

C';s三元条件运算符是否创建新范围?,c,scope,C,Scope,标题基本上说明了这一切,但我特别感兴趣的是知道以下(稍微滥用的)宏是否应该工作(使用C99或更高版本),也就是说,它将根据表达式的大小返回指向堆栈分配内存的有效部分的指针: #include <stdint.h> #define NASTY(expr) ( \ 8 == sizeof(expr) ? (void *)(&(uint64_t){(expr)}) : \ ( \ 4 == sizeof(expr) ? (void *)(&

标题基本上说明了这一切,但我特别感兴趣的是知道以下(稍微滥用的)宏是否应该工作(使用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)}) \
        ) \
    ) \
)
#包括
#定义讨厌(expr)(\
8==sizeof(expr)?(void*)(&(uint64_t){(expr)}):\
( \
4==sizeof(expr)?(void*)(&(uint32_t){(expr)}):\
( \
2==sizeof(expr)?(void*)(&(uint16){(expr)}):(void*)(&(uint8){(expr)})\
) \
) \
)
编辑:


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

我不知道你所说的“新范围”是什么意思——在C中,“范围”只与标识符相关,而与对象生命周期无关。根据6.5.2.5复合文字

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

因此,如果在函数体中使用此宏,则指向对象的生存期将持续到封闭块的执行结束。这可能满足您的需求,也可能不满足您的需求;你可能会因为写以下内容而陷入麻烦:

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

给出一些用例示例。我的意思很好,但是为什么这个问题需要用宏来提出呢?为什么预处理器是相关的?或者你是在利用不是标准c语言的表达式语句吗?为什么三元运算符是相关的?您只是在获取某个对象的地址。@EOF:复合文字是左值。你可以记下他们的地址。范围是如何表达的??实际上,你想知道“什么是作用域”。这正是我根据一些Dr.Memory测试所期望的行为。谢谢你的解释@奥拉夫:没有这样的事<代码>静态不是类型的一部分;这是一个存储类。将
static
放在复合文字的括号中只是一个语法错误。@R..:谢谢您提供的信息。我知道语法上什么是静态的。如果语法允许存储类说明符,我就懒得检查复合文本的语法。如果指针被取下,我可以看到一些用法(但是,在睡眠之后,也可以使用
static
变量,因此它会更符合语法/语法)。