宏非常有用。
因此,我偶尔会哀叹Java和C#中缺少宏。宏允许我强制内联,但允许我非宏代码的代码可管理性。
是否有任何基于Java或C#的项目/产品可以有效地允许宏或指定内联扩展。
我在想像
这样的东西@macro public void hello(int x){...}
或当我调用一个方法时,调用之前的@inline注释会影响被调用方法的内联。
或者,我是否应该知道我应该相信编译器能够为我做出最好的决定,即在其分析的最佳状态下,它可以在线调用。
我希望这个问题不会导致辩论宏的利弊/有用性。
答案 0 :(得分:7)
我建议相信JIT编译器在内联时做出决定。
但是,如果您只是出于其他目的而在宏之后,在C#/ .NET中,还有其他选项。可以通过T4(文本模板转换工具包)完成用于实用程序的宏的大部分工作。例如,这是许多ORM包的基础。
答案 1 :(得分:4)
宏不是标准Java语言的一部分,我不知道主流Java工具,IDE等支持任何宏预处理器。因此,如果您在Java代码中使用宏,您应该会遇到一些“痛苦”。例如,
有很多针对Java的第三方宏预处理器的例子;例如Jatha,OpenJava,PrintMacroJ,JavaMacros等等......(但您是否遇到过使用其中任何一个项目的项目?)
宏允许我强制内联,但允许我非宏代码的代码可管理性。
真。但是JIT编译器可能比确定应该内联的内容做得更好。它将知道(肯定)块有多大,并且它将具有执行频率,分支预测等的运行时统计信息,这些都是您无法使用的。
请注意,有一些Hotspot JVM调优选项可以影响优化器的内联决策;请参阅this page,然后扫描“inlin”。例如,有一个似乎允许您增加内联方法体的上限阈值。
答案 2 :(得分:2)
看看龙目岛项目 - http://projectlombok.org/features/Log.html
这是一个注释库,允许以下代码剪切 - 它(我相信)正是你所说的。
import lombok.extern.slf4j.Log;
@Log
public class LogExample {
public static void main(String... args) {
log.error("Something's wrong here");
}
}
@Log(java.util.List.class)
public class LogExampleOther {
public static void main(String... args) {
log.warn("Something might be wrong here");
}
}
答案 3 :(得分:1)
您可以编写自己的注释... http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html
您也可以使用像m4这样的宏语言,然后使用make调用它。 http://www.gnu.org/software/m4
您也可以使用C预处理器。 C预处理器(cpp)是C编程语言的预处理器。在许多C实现中,它是由编译器调用的单独程序,作为转换的第一部分。预处理器处理源文件包含(#include),宏定义(#define)和条件包含(#if)的指令。预处理程序指令的语言与C的语法无关,因此C预处理程序也可以独立使用来处理其他类型的文件
就为编译器提供优化建议而言,Java没有强制代码内联的工具。