Don*_*ild 11 c variables struct
例:
struct dummy
{
int var;
};
Run Code Online (Sandbox Code Playgroud)
为什么使用这样的结构?大多数情况下,我在一些头文件中看到过它们.
的atomic_t类型也被定义这样的.不能简单地定义使用:
typedef int atomic_t;
Run Code Online (Sandbox Code Playgroud)
它更具可扩展性.
假设在将来,您意识到struct dummy应该包含名称字段,然后您可以将其定义更改为:
struct dummy
{
int var;
char name[30];
};
Run Code Online (Sandbox Code Playgroud)
没有改变你的应用程序代码.
除了可扩展性之外,这个成语还使得在语法上不可能对其意义在语义上没有意义的类型进行常规算术.
例如:
typedef uint32_t myObject;
myObject x, y;
...
y = x + 3; // meaningless, but doesn’t produce an error.
// may later cause runtime failure.
Run Code Online (Sandbox Code Playgroud)
VS
typedef struct { uint32_t var; } myObject;
myObject x, y;
...
y = x + 3; // syntax error.
Run Code Online (Sandbox Code Playgroud)
这可能看似人为,但它偶尔会非常有用.
另一个用途是将整个数组传递给函数.
struct s {
int a[3];
};
void f1(int a[]) // this evaluates to a pointer, same as void f1(int *a)
{
printf("%d\n", sizeof(a));
}
void f2(struct s *obj)
{
printf("%d\n", sizeof(obj->a));
}
int main(int argc, char **argv)
{
int a[3] = {1, 2, 3};
struct s obj;
obj.a[0] = 1;
obj.a[1] = 2;
obj.a[2] = 3;
f1(a);
f2(&obj);
return 0;
}
// output
// 8
// 12
Run Code Online (Sandbox Code Playgroud)
并非所有可以用 32 位表示的东西都应该被视为数字。即使具有数值的事物也可能具有表明它们需要特殊处理的语义。例如,假设处理器具有“原子增量”指令,但它比“正常”增量指令慢。如果想fnord在一个地方原子地递增并在另一个地方递减,可以使用:
volatile int fnord;
...
atomic_inc(&fnord);
...
atomic_dec(&fnord);
Run Code Online (Sandbox Code Playgroud)
然而,这样做的一个问题是,如果应该递增的地方之一fnord碰巧使用了fnord++而不是atomic_inc(&fnord);,编译器将完美地生成一条“正常”递增指令,并且代码可能在大多数情况下都可以工作,但它可能会以难以追踪的方式失败。
int用结构替换(并定义atomic_inc内联函数以使用它)将防止fnord++;编译等错误代码。它不会防范fnord.var++;,但会给程序员一个机会检查结构并看看增加它的正确方法是什么。