在课堂上,教授说他喜欢 C 而不是 Java 的一个原因是 C 有一个预处理器,特别是宏。与使用所需值声明final
/变量相比,宏有什么好处吗?const
我知道 Java 没有全局变量,所以是否会出现使用变量代替宏不起作用的情况?
3 回答
在 C 语言中使用宏系统是一个由来已久的传统,通常会导致难以理解的构建链和非常特定于项目的构建配置。我认为在 C 中存在宏的原因是为了克服它作为一种语言在您需要宏提供的东西时所具有的缺点(例如,您可以在 Java 中使用接口,这解决了需要制作“通用的”实例)。
尽管如此,有时拥有一个宏观系统似乎更容易解决问题。我确实知道一些商店会这样做——例如——当他们需要支持多个不同版本的 API 时。通常,您可以通过在设计中正确使用接口和良好的抽象层来克服 Java 中的这个问题。但是,那里有 Java 的宏系统!如果你愿意,你可以使用它们。您可能还注意到,就宏而言,C 宏并没有什么特别之处。
(在我看来你的老师有点离谱......)
没有理由不能通过宏预处理器运行 Java 代码。它只是没有作为语言的一部分完成。
话虽如此,宏在 C 中有价值的大部分原因是 C 语言的问题,大多数人对它们的使用极其丑陋和适得其反,尽管它们也有很多好的用途。
无论如何,我真的会质疑那些根据一个有宏而另一个没有宏来比较 C 和 Java 的人的专业知识。在事物的大计划中,这似乎是语言之间最微不足道的差异之一。突出显示它向我表明该人不理解语言之间的真正差异;也许他喜欢 C,但不知道如何命名 C 相对于 Java 的任何实际特性——比如存储持续时间和类型的表示。
C 中的宏不仅仅是全局常量。他们还可以定义函数,例如
#define SHOW_DEFINE(x) printf("%s=%s\n", #x, STR(x))
这在调试过程中非常有用。不幸的是,使用宏也很容易伤害自己。
#define MULTIPLY(X,Y) X*Y
可以说 MULTIPLY(1,2) 但如果使用 MULTIPLY(1-1,2-2) = 1-2*2-2 = 1-4-2 而不是预期的 0*0 会导致问题.
通常,使用现代工具不再需要此类功能,并且具有良好的设计和一些抽象以及 Java 提供的接口通常不需要在 Java 中具有宏。Java的设计,afaik,是为了让自己尽可能地难以开枪。