我想隐藏一些我写的非平凡代码的复杂性。在这里,我想从结构指针隐藏一级间接,以使其更具可读性。我不是在问这是干净还是最佳做法,我知道不是,但我也知道我喜欢做什么:)
那么,kosher是如何拥有像
这样的东西#define getmark() m->o->marked
除了我不会用非学术代码写的事实?这将允许我做
n->getmark()
,这更好(并且更重要)
n->m->o->marked
#define
代码是否正确?它只是在没有附加其他字符串的情况下替换文本吗?
答案 0 :(得分:6)
#define getmark(m) ((m) && (m)->o ? (m)->o->marked : -1)
答案 1 :(得分:4)
坦率地说 - 不是。
你没有让你的代码eaiser阅读,而是隐藏了一个隐藏状态机(m指针指向o)的事实。
你也使这个黑客成为全球性的 - 如果有人有这样的变量,这可能会破坏。
另外......在宏之后添加“()”以使其看起来像是在调用普通函数,而不是2个间接......这样的伎俩很糟糕。它寻找一个读者,就像应该有一个这个名字的功能,但你隐藏了一个怪物(扑克脸......)。
如果您需要简化状态机,并且您知道只有一个状态 - 创建一个全局静态变量并创建普通函数来调用这些对象。
答案 2 :(得分:1)
它会起作用,但即使在C中它也是一个糟糕的主意。请不要这样做。
如果你想避免重复间接的'源膨胀',请使用临时指针。
O* myO;
myO = n->m->o;
o->marked = o->this + o->that;
答案 3 :(得分:0)
原始宏存在的问题是
n->getmark() = 123;
可以工作,但不应该。