使用Haxe宏进行条件编译,而不是#if #end

2024-04-12

假设我们有一个 Local 类:

class Local {
    static inline public var logLevel:Int = 3;
}

以及一些功能:

Tool.debug(s:String)   // compiled if logLevel >= 0
Tool.moreinfo(s:String)// compiled if logLevel >= 1
Tool.info(s:String)    // compiled if logLevel >= 2
Tool.trace(s:String)   // compiled if logLevel >= 3
Tool.warn(s:String)    // compiled if logLevel >= 4
Tool.err(s:String)     // compiled if logLevel >= 5

我们可以在代码中使用 -D 和一些 #if 来实现这一点。

然而,这意味着始终修改 hxml 文件。即使它只是针对一个值,这对我来说并不理想,因为我的所有配置都位于我的 Local 类中。

如果我们使用简单的 if () 测试该值,则即使从未使用过所有 if 和字符串,代码也会变得更大(因为 logLevel 意味着“常量”)。

是否可以使用宏来解决这两个问题?


Edit:

如果用例这么简单,@stroncium 的答案会容易得多:将所有内容都内联,编译器将进行优化,不需要宏。看http://try.haxe.org/#C44Ec http://try.haxe.org/#C44Ec,看看编译后的JS。


假设Local是一个普通的类(你手工编写它,你不使用宏或其他任何东西构建它),然后你可以访问Local.logLevel在宏调用中。

像这样的一些代码可以工作

class Tool {
    public static macro function debug( s:ExprOf<String> ):Expr {
        if ( Local.logLevel>=0 ) {
            // Insert a trace statement into our code. 
            // You could insert any other kind of statement or { block; of; statements; } also.
            return macro trace( $s );
        }
        else {
            // You need to return an expression of some kind.
            // This is the equivalent of writing the line "null;" - it does nothing whatsoever.
            return macro null;
        }
    }
}

或者同样的事情,写得更简洁一点,适用于您的所有功能:

class Tool {
    public static macro function debug( s:ExprOf<String> ):Expr {
        return
            if ( Local.logLevel>=0 ) macro trace( "debug: " + $s );
            else return macro null;
    }
    public static macro function moreInfo( s:ExprOf<String> ):Expr {
        return
            if ( Local.logLevel>=1 ) macro trace( "moreInfo: " + $s );
            else return macro null;
    }
    public static macro function info( s:ExprOf<String> ):Expr {
        return
            if ( Local.logLevel>=2 ) macro trace( "info: " + $s );
            else return macro null;
    }
    public static macro function trace( s:ExprOf<String> ):Expr {
        return
            if ( Local.logLevel>=3 ) macro trace( "trace: " + $s );
            else return macro null;
    }
    public static macro function warn( s:ExprOf<String> ):Expr {
        return
            if ( Local.logLevel>=4 ) macro trace( "warn: " + $s );
            else return macro null;
    }
    public static macro function err( s:ExprOf<String> ):Expr {
        return
            if ( Local.logLevel>=5 ) macro trace( "err: " + $s );
            else return macro null;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Haxe宏进行条件编译,而不是#if #end 的相关文章

  • 如何在 Swift 中使用带有 #define 宏的 Objective-C 代码

    我正在尝试在我的 Swift 项目中使用第三方 Objective C 库 我已将库成功导入到 Xcode 中 并且制作了一个
  • C语言中的宏(#define)

    我正在阅读hoard内存分配器的源代码 在gnuwrapper cpp文件中 有以下代码 define CUSTOM MALLOC x CUSTOM PREFIX malloc x 是什么意思CUSTOM PREFIX malloc x i
  • 这个C++宏的含义是什么?

    我不明白这个宏的含义 define DECLARE HANDLE n typedef struct n int i n DECLARE HANDLE HWND 我从中学到了C程序 表示连接参数 所以宏等于 typedef struct HW
  • 在运行时访问函数源代码的宏

    使用 Scala 宏我想访问函数 f 的源代码 这是我的问题的简化示例 def logFImplementation f gt Boolean val sourceCodeOfF String lt how to get source co
  • 当我们定义宏时,do while(0)有什么用? [复制]

    这个问题在这里已经有答案了 可能的重复 C C 宏中的 Do While 和 if else 语句 https stackoverflow com questions 154136 do while and if else statemen
  • Rails 中的宏是什么?

    我正在读Rails 文档 http guides rubyonrails org active support core extensions html 我遇到过这个词macros 我找不到这个术语的定义 在 Rails 的上下文中 有人可
  • 在结构体中定义宏背后的逻辑是什么?

    正如标题所示 我质疑在结构体中定义宏的原因 我经常在网络编程中看到这种方法 例如以下代码片段 struct sniff tcp u short th sport source port u short th dport destinatio
  • 宏观评估顺序[重复]

    这个问题在这里已经有答案了 可能的重复 宏中的 和 https stackoverflow com questions 4364971 and in macros 为什么第二个 printf 的输出是 f 1 2 宏的计算顺序是什么 inc
  • 什么是“3D语法”?

    在编写 Racket 宏的上下文中 3D 语法 是什么意思 这句话我听过好几次了 包含一次对宏的引用I正在写作 但那是不久前的事了 我修复了它 现在我不记得我最初做错了什么 另外 是 3D 语法吗always坏的 或者是像eval 如果你认
  • getchar() 和 putchar() 是函数还是宏?

    我引用了两个可靠的信息来源 两者似乎对同一事物有不同的定义 http www cplusplus com reference clibr E2 80 A6 http www cplusplus com reference clibr E2
  • GCC ARM 汇编预处理器宏

    我正在尝试使用汇编 ARM 宏进行定点乘法 define MULT a b asm volatile SMULL r2 r3 0 1 n t ADD r2 r2 0x8000 n t ADC r3 r3 0 n t MOV 0 r2 ASR
  • Rust 中带有纯宏的函数组合链

    我读了 如何在 Rust 中编写函数 https stackoverflow com questions 45786955 how to compose functions in rust Rust 中的函数组合链 https stacko
  • 可以用宏获取评论吗?

    我试图解析一些代码并重新格式化它们 但似乎引用只会忽略注释 有什么办法可以实现这一点吗 我想我必须深入 erlang 方面 不 您无法在宏内获取代码注释 它们永远不会成为 AST 的一部分 并且仍然被丢弃在 Elixir 的标记器中
  • 当我有表面声明时,如何为 sm_1X 和 sm_2X 编译 CUDA 程序

    我正在编写一个使用表面 重新采样并写入纹理 来提高性能的库 surface
  • Java 源文件中可以有宏吗

    在我的程序中 我多次从控制台读取整数 每次 我都需要输入这一行 new Scanner System in nextInt 我习惯了 C C 我想知道我是否可以定义类似的东西 define READINT Scanner System in
  • 宏的问题

    HI 有人可以帮助我理解为什么 SQUARE x 的值为 49 吗 我正在使用 Visual C 6 0 define SQUARE X X X int main int argc char argv int y 5 printf d n
  • 无法在 C++ 中使用宏定义类

    我想生成许多几乎没有什么区别的子类 所以我想使用宏来简化我的工作 宏定义如下 define DECLARE SUB CLASS sub class name base class name value1 class sub class na
  • 宏扩展忽略了 MSVC 中的一些标记

    我在 msvc 编译器中遇到宏扩展问题 我希望将以下代码扩展为F x 它在 gcc 和 clang 上执行 但 msvc 将其扩展为F忽略x令牌 这里发生了什么 define S s s define F define M S S F x
  • 用宏包装函数(无需重命名)C

    我有兴趣通过包装现有函数调用来添加一些额外的逻辑without重命名它们 仅供测试 我发现的现有解决方案依赖于将函数包装在不同名称的宏中 这可能意味着更改大量代码 有什么建议么 请注意 我知道LD PRELOAD 但我有兴趣使用宏来检查传递
  • Clojure 宏expand

    Why does macroexpand arm getHand getFinger 扩展到 arm getHand getFinger while macroexpand gt arm getHand getFinger 扩展到 getF

随机推荐

  • Dagger - 在不同组件上获取相同实例

    我遇到了类似的问题this https stackoverflow com questions 40745279 dagger 2 provide same instance between multiple component with
  • 如何用UML表示通信协议?

    在我的 UML 模型中 我有一个系统及其相互通信的子组件 例如 我有一台计算机和一个遥控机器人 它们通过蓝牙进行通信 目前图中的流程类似于 计算机 触发 遥控车 的 setVelocity 函数 在这一点上 我想通过说以下的话来完善沟通 计
  • 使用 Powershell 在单独的单独行上列出完全路径文件名?

    如果我执行 Get ChildItem ext recurse 输出由一系列目录部分组成 后跟由所述目录部分分隔的每个匹配文件的一列或多列信息 有类似 Unix find 命令的东西吗 其中每个匹配的文件名及其完整的相对路径都出现在一行中
  • 原生 JavaScript 中的 jQuery.getScript 替代方案

    我正在尝试动态加载 JS 脚本 但不能使用 jQuery 我检查了 jQuery 源代码以了解如何获取脚本 http api jquery com jQuery getScript 已实现 以便我可以使用该方法使用本机 JS 加载脚本 但是
  • Silverlight 绑定到 TranslateX

    我有一个简单的 winphone7 应用程序 但我认为这适用于任何 silverlight 基本上我有一个椭圆 我想用平移 X 和 Y 属性来移动它 这是我的尝试
  • 在.net winform中创建圆角容器

    我想在 winform net 中创建圆角容器 我的目标是创建一个容器 这样如果我将任何其他控件放入其中 该控件也将变成圆形 这可能吗 您正在寻找Control Region财产 http msdn microsoft com en us
  • PDF 可以在 Chrome 中呈现,但不能在 Acrobat 中呈现

    PDF 1 7 4 0 obj lt ObjStm N 3 First 14 Length 139 gt gt stream 1 0 2 41 3 76 lt Catalog Version 1 7 Pages 2 0 R gt gt lt
  • Vs2017:查找资源字典时出错

    当我尝试引用我的 app xaml 文件的资源字典时 出现以下错误
  • 使用 Promise 时保留变量的最佳实践[重复]

    这个问题在这里已经有答案了 我是 Promises 的新手 我想知道在沿着链向下的同时保留变量的最佳实践是什么 通过 Promise 连接到 MongoDB 非常简单 connectToMongoDB data done function
  • 奇数耙数据库:迁移输出

    为什么rake db migrate run Execute db schema dump我的输出全部搞砸了 显示 SQL 看起来像这样 ActiveRecord SchemaMigration Load 0 5ms SELECT sche
  • FastAPI,返回带有 sql 查询输出的文件响应

    我正在使用 FastAPI 目前我返回一个 csv 这是我用 pandas 从 SQL Server 读取的 pd read sql 然而 csv 对于浏览器来说相当大 我想用文件响应返回它 https fastapi tiangolo c
  • Java 点与“任何字符”不匹配

    点应该匹配任何字符 那么为什么这个正则表达式不起作用呢 String url http wikipedia org System out println url replace htt Output http wikipedia org S
  • 是否可以将文件附加到 ios 日历事件?

    在 Mac OS 中 可以将文件附加到日历事件并读取 iOS 日历上的 dat 文件 问题 是否可以使用 Event Kit 框架将文件附加到 iOS 日历事件 我在中找不到任何提示事件套件文档 https developer apple
  • 我应该将 std::string 与“string”或“string”进行比较吗?

    考虑这个代码片段 bool foo const std string s return s hello comparing against a const char literal bool bar const std string s r
  • 输入文件点击Chrome

    好的 我有一个文件类型和 id test 的输入元素 当我输入地址栏时 javascript document getElementById test click 会弹出打开文件对话框 以便用户可以决定上传什么 但是 如果将同一行插入到文档
  • Spring AOP:- 在 joinPoint 中获取参数名称为 null

    LoggingAspect java Around allGenericAppServiceImplMethods public Object LoggingAdvice ProceedingJoinPoint joinPoint thro
  • Java Logger 不写入文件

    我正在尝试将 Logger 配置为写入应用程序配置文件夹中的文件 但我无法弄清楚如何执行此操作 这是我在程序启动时用于配置日志输出的函数 private void ConfigureLogger Logger logger Logger g
  • 返回正则表达式中匹配的部分

    在使用的正则表达式中OR 管道 是否有一种方便的方法来获取匹配的表达式部分 Example horse caMel TORTOISe i exec Camel returns Camel 我想要的是caMel 我知道我可以循环遍历选项 而不
  • 单步执行断点时出现编译错误

    每当我遇到断点并尝试跨过它或进入它时 我就开始遇到奇怪的错误 我收到消息 进行了无法编译的编辑 在修复编译错误之前 无法继续执行 这些项目编译得很好 当我没有遇到任何断点时 这种情况就不会发生 我使用的是 Visual Studio 201
  • 使用Haxe宏进行条件编译,而不是#if #end

    假设我们有一个 Local 类 class Local static inline public var logLevel Int 3 以及一些功能 Tool debug s String compiled if logLevel gt 0