我找到了将宏定义为#define VAR {0}
的代码。
它是否有任何特殊含义,或者与将宏定义为零相同?
代码:
#define VAR {0}
答案 0 :(得分:2)
#define VAR {0}
它有什么特殊含义
否。
...还是将宏定义为零?
否。
这里没有魔术。 VAR
实际上将扩展为{0}
。
答案 1 :(得分:1)
在C中,{0}
是“通用零初始值设定项”,可用于初始化任何对象,其方式与在具有静态存储持续时间且没有显式初始值设定项的情况下进行初始化的方式相同。标准库(mbstate_t
)和第三方库中有一些地方需要零初始化的对象,但是该对象在语义上是不透明的,因此对于显式而言,它将是不可移植的或反习惯的通过名称初始化成员,甚至假设它具有成员(例如,可能只是将其定义为裸整数或指针类型)。 {0}
适用于所有这些。
这种情况的一种特殊情况是用于创建伪复合文字,即(type){0}
。当您要丢弃输出时,这些方法对于传递给不接受空指针的函数很有用,因为您可以传递&(type){0}
。
否则,我不知道{0}
会有用。
为此定义一个宏并将其命名为VAR
是很不常见的,并且在没有更多上下文的情况下,作者不清楚这是什么意思。
答案 2 :(得分:-1)
看起来该宏用于防止未初始化的变量,因为它可能导致未定义的行为。可以这样使用:
#define VAR {0}
double var1 VAR;
struct some_struct s1 VAR;
char * ptr1 VAR;
尽管该宏可能具有其他含义或使用范围,但我的假设是基于其名称的。