是否有Java或C#的宏设施?

宏很有用。

因此,我偶尔会哀叹Java和C#中缺少宏。 宏允许我强制内联,但允许我非宏代码的代码可管理性。

是否有任何基于Java或C#的项目/产品可以有效地允许宏或指定内联扩展。

我在想类似的东西

@macro public void hello(int x){…}

或者当我调用一个方法时,调用之前的@inline注释会影响被调用方法的内联。

或者,我是否应该知道我应该相信编译器能够为我做出最好的决定,即在其分析的最佳状态下,它可以在线调用。

我希望这个问题不会导致辩论宏的利弊/有用性。

宏不是标准Java语言的一部分,我不知道主流Java工具,IDE等支持任何宏预处理器。 因此,如果您在Java代码中使用宏,您应该会遇到一些“痛苦”。 例如,

  • 源代码调试器不允许您设置相对于原始源代码的断点。
  • 如果您共享Java-with-macros代码,许多Java开发人员可能会对此嗤之以鼻,并且/或者抱怨必须安装/使用额外的工具。

有很多关于Java的第三方宏预处理器的例子; 例如Jatha , OpenJava , PrintMacroJ , JavaMacros等……(但你有没有遇到过使用其中任何一个的项目?)


宏允许我强制内联,但允许我非宏代码的代码可管理性。

真正。 但JIT编译器可能比确定内联应该做的更好。 它将知道(肯定)块有多大,并且它将具有执行频率,分支预测等的运行时统计信息,这些都是您无法使用的。

请注意,有一些Hotspot JVM调优选项可以影响优化器的内联决策; 看到这个页面 ,并扫描“inlin”。 例如,有一个似乎允许您增加内联方法体的上限阈值。

我建议相信JIT编译器在内联时做出决定。

但是,如果您只是出于其他目的而在宏之后,在C#/ .NET中,还有其他选项。 可以通过T4 (文本模板转换工具包)完成用于实用目的的宏的大部分工作。 例如,这是许多ORM包的基础。

看看Lombok项目 – 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"); } } 

您可以编写自己的注释… 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没有强制代码内联的工具。