为什么Java没有宏?

时间:2012-09-27 05:11:39

标签: java c variables language-agnostic macros

在课堂上,教授说他比C更喜欢C的一个原因是C有一个预处理器,特别是宏。在声明具有所需值的final / const变量时,宏是否有任何好处?我知道Java没有全局变量,所以是否会出现使用变量代替宏的情况?

3 个答案:

答案 0 :(得分:5)

在C语言中使用宏系统一直是一个长期存在的传统,通常会导致难以理解的构建链,以及非常特定于项目的构建配置。我认为C中存在宏的原因是为了克服它作为一种语言的缺点,当你需要宏提供的东西时(例如,你可以在Java中使用接口来解决需要制作的问题)通用的“事物的实例”。

尽管如此,有时候让宏观系统似乎更容易适应问题。我知道有些商店会这样做 - 例如 - 当他们需要支持多个不同版本的API时。通常,您可以通过在设计中正确使用接口和良好的抽象层来克服Java中的这个问题。但是,那里有are macro systems for Java!如果你愿意,你可以使用它们。您可能还会注意到,就宏而言,C宏实际上并不是特别的。

(在我看来,你的老师有点偏离......)

答案 1 :(得分:4)

没有理由不能通过宏预处理器运行Java代码;它只是没有作为语言的一部分。

话虽如此,C语言中宏的大部分原因都是C语言的问题,大多数人使用它们都非常难看并适得其反,尽管它们也有许多好的用途。

无论如何,我真的会质疑比较C和Java的人的专业知识,因为有人拥有宏而另一人没有。在大事情中,这似乎是语言之间最微不足道的差异之一。突出显示它告诉我,这个人不理解语言之间的真正差异;也许他喜欢C,但不知道如何命名C对Java的任何实际特征 - 比如存储持续时间和类型表示。

答案 2 :(得分:3)

C中的宏不仅仅是全局常量。他们还可以定义函数,比如

#define SHOW_DEFINE(x) printf("%s=%s\n", #x, STR(x))

这在调试过程中非常有用。不幸的是,使用Macros很容易伤到自己。

#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的设计是为了尽可能地让自己拍摄。