当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《宏可以用于对变量的只读访问吗?》经验,为你挑选了3个好方法。

你能定义一个访问普通变量的宏,但是只能以只读的方式定义(除了将它定义为对函数的调用)吗?例如,以下代码中的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. */
}

Joshua Swink.. 11

好的,我提出了一个:

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

实际上可能没有,我认为结肠两侧的数据类型在第三级运算符中必须相同.因此,如果o-> value是一个结构,例如,我认为这不会起作用.你可以把(o) - >值放在冒号的两边. (3认同)


Mark Ransom.. 7

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

#define VALUE(x) (x+0)

或者在你的例子中,

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


J. C. Salomo.. 6

参见C标准(C99和C1x)中的§6.5.17:"逗号运算符不会产生左值."

#define VALUE(x) (0, x)

(不能移植到C++.)



1> Joshua Swink..:

好的,我提出了一个:

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


实际上可能没有,我认为结肠两侧的数据类型在第三级运算符中必须相同.因此,如果o-> value是一个结构,例如,我认为这不会起作用.你可以把(o) - >值放在冒号的两边.

2> Mark Ransom..:

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

#define VALUE(x) (x+0)

或者在你的例子中,

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



3> J. C. Salomo..:

参见C标准(C99和C1x)中的§6.5.17:"逗号运算符不会产生左值."

#define VALUE(x) (0, x)

(不能移植到C++.)

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有