3

我想从我正在编写的一些非平凡代码中隐藏一些复杂性。在这里,我想从结构指针中隐藏一层间接,以使其更具可读性。我不是在问这是否干净或最佳实践,我知道不是,但我也知道我想实现什么:)

所以,有类似的东西是多么洁净

#define getmark() m->o->marked

除了我不会用非学术代码编写它的事实之外?那会让我做

n->getmark()

,这更好(而且比这更重要)

n->m->o->marked

代码是否#define正确?它会在这里做一个文本替换而不附加其他字符串吗?

4

4 回答 4

6

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

#define getmark(m) ((m) && (m)->o ? (m)->o->marked : -1)
于 2013-10-23T17:35:18.973 回答
4

坦率地说 - 不是。

您并没有使您的代码更易于阅读,而是隐藏了一个隐藏状态机的事实(指向 o 的 m 指针)。

您还可以使这个 hack 全局化——如果有人有这样的变量,它可能会中断。

另外......在宏之后添加“()”以使其看起来像调用普通函数而不是2个间接函数的技巧......很糟糕。它看起来应该有一个具有此名称的函数的读者,但是你隐藏了一个怪物(扑克脸......)。

如果您需要简化状态机,并且您知道只有一种状态 - 创建一个全局静态变量并创建普通函数来调用这些对象。

于 2013-10-23T17:34:48.173 回答
1

它会起作用,但即使在 C 语言中,这也是一个糟糕的主意。请不要这样做。

如果您想避免重复间接的“源膨胀”,请使用临时指针。

O* myO;

myO = n->m->o;

o->marked = o->this + o->that;
于 2013-10-23T17:32:37.670 回答
0

你原来的宏的一个问题是

n->getmark() = 123;

会起作用,而它不应该起作用。

于 2013-10-23T19:48:21.120 回答