宏可以用于对变量的只读访问吗?

时间:2008-09-26 17:31:27

标签: c c-preprocessor

你能定义一个访问普通变量的宏,但是只能以只读方式(除了将其定义为对函数的调用)吗?例如,以下代码中的VALUE宏是否可以通过dostuff()函数导致编译错误的方式定义?

struct myobj {
  int value;
}

/* This macro does not satisfy the read-only requirement */
#define VALUE(o) (o)->value

/* This macro uses a function, unfortunately */
int getvalue(struct myobj *o) { return o->value; }
#define VALUE(o) getvalue(o)

void dostuff(struct myobj *foo) {
   printf("The value of foo is %d.\n", VALUE(foo)); /* OK */
   VALUE(foo) = 1; /* We want a compile error here */
   foo->value = 1; /* This is ok. */
}

5 个答案:

答案 0 :(得分:11)

好的,我想出了一个:

#define VALUE(o) (1 ? (o)->value : 0)

答案 1 :(得分:7)

如果变量始终为数字,则可以:

#define VALUE(x) (x+0)

或在您的示例中,

#define VALUE(x) (x->value+0)

答案 2 :(得分:6)

参见C标准(C99& C1x)中的§6.5.17:“逗号运算符不产生左值。”

#define VALUE(x) (0, x)

(不能移植到C ++。)

答案 3 :(得分:2)

尝试

#define VALUE(o) (const int)((o)->value)

答案 4 :(得分:-1)

这是一个难题还是一项工程任务? 如果这是一项工程任务,那么有更好的方法可以在C中获得结构的不透明度。在this blog article中,我写了一篇关于如何在C中做到这一点的足够描述。