#define用于教学目的

时间:2013-10-23 17:26:30

标签: c

我想隐藏一些我写的非平凡代码的复杂性。在这里,我想从结构指针隐藏一级间接,以使其更具可读性。我不是在问这是干净还是最佳做法,我知道不是,但我也知道我喜欢做什么:)

那么,kosher是如何拥有像

这样的东西
#define getmark() m->o->marked

除了我不会用非学术代码写的事实?这将允许我做

n->getmark()

,这更好(并且更重要)

n->m->o->marked

#define代码是否正确?它只是在没有附加其他字符串的情况下替换文本吗?

4 个答案:

答案 0 :(得分:6)

恕我直言,大多数C程序员更喜欢函数式宏,如:

#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;

可以工作,但不应该。