gpt4 book ai didi

c++ - 预处理器强制一致性,C++ 中的一个好主意?

转载 作者:行者123 更新时间:2023-11-30 02:06:06 25 4
gpt4 key购买 nike

我刚读了文章"Idiomatic Programming"它试图强调一个重要的概念:语言不应该决定你如何解决问题,而是你应该决定语言应该如何解决问题。

例如,作者选择C/C++ 预处理器来做两件事:

  1. 强制一致性

  2. 为现有语言添加句法和文法。

现在,我知道这篇文章至少可以追溯到 2003 年并且使用的是 C 语言,但我看到其他人至少使用过第 1 点(例如 Ogre 3D)。

给出的例子是:

#define property(name, type)   :                             \
type m##name; \
public: \
type name() \
{ return m##name; } \
void name(type t__##name) \
{ m##name = t__##name; }

这样使用:

class MyClass
{
protected property(age, unsigned short);
private property(gpa, float);

private: // Other stuff can go here
};

除了宏是邪恶的并且我们应该使用现代 C++ 变体这一事实之外,据我所知没有合适的替代解决方案,我相信这就是 Boost.Wave 和 Boost.Preprocessor 的目的是为了澄清和提高。

我相信这有一些优点,但我想从使用过/看到它的人那里知道,你有什么想法?作者的观点和例子是否仍然有值(value),或者它是否值得阅读、仔细考虑并作为一个很好听的小道消息藏起来?

编辑

感谢您的回答!

我想快速详细说明问题的性质。它不是“这个例子好用吗?”问题,它是作者提出的用于丰富或增强现有语言的更改和扩展类型的示例。因此,问题是:滥用预处理器以添加语言扩展并基于此和其他宏代码段的示例强制一致性是否可以接受?

最佳答案

恕我直言,在这种情况下,用宏封装一个属性不会增加任何值,只是稍微混淆了代码。此外,您不能编写一个自定义的 getter/setter 而让另一个保持原样。

我在两年前工作的地方为一些常见的列表模式做了这种事情(在我的历史中搜索像 C、宏、预处理器这样的标签,然后惊讶!:-p

Functional programming in C with macro "Higher Order Function" generators

C function decorators (wrappers) at compile time),现在我认为这不是最好的主意。

人们(和工具!)在你做“聪明的把戏”时很容易混淆。例如,在您的示例中,如果有人使用它的 IDE 自动完成功能,它可能不会显示您的方法或属性。

所以,除非你真的需要做一些聪明强大的事情,否则你有合适的工具并且它在你的环境中是惯用的(想想 Python 的数据模型,您实际上可以在其中拥有属性描述符或 Common Lisp 的宏),尽量使事情尽可能明确。它将为您节省很多 WTF 面孔。

关于c++ - 预处理器强制一致性,C++ 中的一个好主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9077437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com