Uni-app条件编译(// #ifndef APP)
click() {// #ifndef APPuni.showToast({title: '请在APP上使用',icon: 'none'})return// #endif// #ifdef APP-PLUSthis.showBarButton(true)this.$refs.hgQrCode.scanplus()// #endif},这里的“//”一开以为就是注释的意思,但后来发现并不是!
首先这段代码的功能是,用户点击按钮,若如果不是APP平台(包括H5、各种小程序、快应用等所有非APP环境),则显示'请在APP上使用'。若是在app上就执行下面扫码功能代码。
条件编译指令(#ifndef、#ifdef)是在代码打包编译时生效的,不是运行时判断。它们像一把剪刀,把不需要的代码直接剪掉。
APP平台编译后的实际代码
当你打包成 APP 时,编译器处理后的真实代码是这样的:
click() {// 非APP代码被完全删除// #ifndef APP// ...整段消失// #endif// #ifdef APP-PLUSthis.showBarButton(true)this.$refs.hgQrCode.scanplus()// #endif
},根本没return语句,所以流程自然继续执行。
H5/小程序平台编译后的实际代码
当你打包成 H5 或 小程序 时,编译器处理后的真实代码是这样的:
click() {// #ifndef APPuni.showToast({title: '请在APP上使用',icon: 'none'})return // 这是平台内唯一的return,直接退出// #endif// APP代码被完全删除// #ifdef APP-PLUS// ...整段消失// #endif
},没有后续代码需要执行,直接退出方法。
图示流程
源码 → [编译器判断平台] → 裁剪掉不符合的代码 → 生成平台专用代码 → 运行时执行
关键点:条件编译是编译期的代码物理删除,不是运行期的if/else逻辑判断。所以不会有"执行到return"再去判断平台的矛盾。
