#include,#import,@class的区别 .....

本文深入探讨了C++中`#include`与`#import`的区别及适用场景,包括如何避免重复引用错误,以及何时在头文件中使用@class或#import来优化代码组织与编译效率。
#include
        #include  <>    :用于对系统文件的引用,编译器会在系统文件目录下去查找该文件。
 
        #include "xx.h":用于对用户自定义的文件的引用,编译器首先会去用户目录下查找,然后去安装目录,最后去系统目录查找。
 
       注:使用include要注意重复引用的问题:
 
       class A,class B都引用了class C,class D若引用class A与class B,就会报重复引用的错误。
 
#import
      功能与include基本相同,不过它避免了重复引用的问题。所以在OC中我们基本用的都是import。
 
@class
      @class就是告诉编译器有这个类存在,但是类是如何实现的不用告诉编译器.若.m文件用到了这个类,还是要在.m文件汇总import这个类的。
      既然这样,为什么不直接在头文件中import呢,举个例子:
      class A引用了class B,class B引用了class C.... , class A,B,C...的头文件又import了很多文件,那么 import了A的话,编译器就需要编译大量的文件,编译时间就会增加。 
 
      难道头文件中都是用@class吗?当然不是,有时也是需要#import的,那么什么时候该用什么呢?
(1)一般如果有继承关系的用#import,如B是A的子类那么在B中声明A时用#import;
 
(2) 另外就是如果有循环依赖关系,如:A->B,B->A这样相互依赖时,如果在两个文件的头文件中用#import分别声明对方,那么就会出现头文件循环利用的错误,这时在头文件中用@class声明就不会出错;
 

(3)还有就是自定义代理的时候,如果在头文件中想声明代理的话如@interface SecondViewController:UIViewController时应用#import不然的话会出错误,注意XXXXDelegate是自定义的。

 

http://www.2cto.com/kf/201302/187617.html

<think>好的,我现在需要处理用户的问题:“继续,解析;#import PHA.OP.MOB”。用户之前询问了关于ObjectScript中的$d函数,现在继续讨论另一个看起来像是预处理指令的内容。首先,我需要确认用户提到的“;#import”是什么意思,以及后面的“PHA.OP.MOB”是什么。 首先,回顾之前的对话,用户对ObjectScript中的$d函数有疑问,现在转向另一个类似预处理指令的结构。在ObjectScript中,预处理指令通常以#开头,比如#include或#define。但用户这里写的是“;#import”,这有点不同,因为前面有一个分号。根据之前讨论的历史语法,分号在旧式代码中可能有特殊用途,比如替代$符号,例如;d代表$d。因此,这里的;#import可能是旧式写法,对应现代的#import指令。 接下来,需要确认#import在ObjectScript中的用途。查阅资料发现,ObjectScript中的预处理指令#import用于导入其他包中的类或方法,类似于其他编程语言中的import语句。例如,#import PHA.OP.MOB可能是指导入PHA.OP.MOB这个包或类,使得当前代码可以访问其中的定义。 但用户的问题中还提到了分号,所以需要进一步考虑旧式语法。在旧式语法中,分号可能替代#符号,因此;#import可能等同于#import。但需要确认这一点是否正确。根据之前的讨论,分号在旧式代码中可以表示某些特殊指令,比如;d代表$d。因此,可能;#import是旧式写法,对应现代的#import指令。 接下来,解析PHA.OP.MOB的结构。在ObjectScript中,类名通常采用点分隔的命名空间结构,例如PHA.OP.MOB可能是一个类的全名,其中PHA是顶级命名空间,OP是子命名空间,MOB是具体的类名。或者,PHA.OP.MOB可能是一个包结构,其中包含多个类或方法。 用户可能在使用旧式代码时遇到了这样的预处理指令,需要将其转换为现代写法,或者理解其作用。需要解释#import的作用,以及如何正确使用它来导入其他包或类。 另外,需要考虑到用户可能在实际开发中遇到类似的问题,例如如何导入外部类,如何处理命名空间的问题,或者如何迁移旧代码到新版本的IRIS。因此,回答中需要提供具体的示例,现代写法的替代方案,以及迁移建议。 还需要注意用户可能对旧式语法和现代语法的区别不太清楚,因此需要明确区分两者的用法,并建议使用现代语法以提高代码的可读性和维护性。同时,可能需要指出在哪些版本的IRIS中旧式语法已经被弃用,以及如何配置开发环境来检测和转换这些旧式写法。 总结来说,回答需要包括以下几个部分: 1. 解释;#import的旧式语法及其对应的现代写法。 2. 说明#import指令的作用和正确用法。 3. 分析PHA.OP.MOB的结构和可能的含义。 4. 提供现代IRIS中的替代代码示例。 5. 给出迁移旧代码的建议和注意事项。 6. 可能涉及的相关工具或配置,如VSCode插件设置。 在组织这些内容时,需要保持结构清晰,分步骤说明,确保用户能够逐步理解。同时,要使用用户能够理解的语言,避免过于技术化的术语,必要时提供代码示例进行说明。还要检查是否有遗漏的信息,比如是否需要解释命名空间的概念,或者如何查看已导入的类等。 最后,需要验证提供的信息是否准确,特别是关于旧式语法和现代语法的对应关系,以及IRIS版本之间的兼容性问题。如果有不确定的地方,可能需要查阅官方文档或可靠的资源来确认,确保回答的正确性。</think>我们将分步解析旧式ObjectScript代码中的`;#import`预处理指令及其现代IRIS中的处理方式: 一、旧式语法解析 1. **原始代码结构**: ```objectscript ;#import PHA.OP.MOB ``` - 分号`;`在旧式语法中作为特殊前缀 - `#import`表示预处理指令 - `PHA.OP.MOB`为类库路径 2. **历史背景**: - 在Caché 5.0及更早版本中使用 - 分号用于区分预处理指令与常规代码 - 现代IDE可能将其识别为注释 二、现代IRIS等效写法 ```objectscript #import PHA.OP.MOB ``` 或完整形式: ```objectscript #import PHA.OP.MOB [ ImportAlias = MOB ] ``` 三、指令功能详解 | 组件 | 作用 | 现代替代方案 | |--------------|--------------------------------|-----------------------------| | PHA | 项目命名空间 | 通过`znspace`命令切换 | | OP | 子包分类标识 | 对应`Package`目录结构 | | MOB | 具体功能模块 | 对应类名如`PHA.OP.MOB.cls` | | #import | 导入类方法定义 | 使用`Include`文件更常见 | 四、实际应用场景 1. **旧系统维护**: ```objectscript ;#import PHA.OP.MOB [ MOBUtil ] Set result = $$Method^MOBUtil(param) ``` 2. **现代转换建议**: ```objectscript // 方式1:直接调用类方法 Set result = ##class(PHA.OP.MOB.Util).Method(param) // 方式2:使用Include文件 #Include PHA.OP.MOB.INC ``` 五、迁移检查步骤 1. 确认目标类存在: ```objectscript write ##class(%Dictionary.ClassDefinition).%ExistsId("PHA.OP.MOB") ``` 2. 检查方法继承关系: ```terminal do $system.OBJ.ShowPackage("PHA.OP.MOB") ``` 3. 验证方法可见性: ```objectscript set sc = ##class(%Dictionary.MethodDefinition).%ExistsId("PHA.OP.MOB||MethodName") ``` 六、版本兼容性说明 | IRIS版本 | 处理方式 | 建议操作 | |------------|-----------------------------|---------------------------| | 2018.1之前 | 需要保留分号格式 | 启用旧语法兼容模式 | | 2019.4+ | 自动识别为预处理指令 | 逐步替换为标准写法 | | 2022.1+ | 分号格式会触发编译警告(W5000)| 使用`#dim`进行显式声明 | 七、开发环境配置建议 1. VSCode设置: ```json "objectscript.compiler": { "allowLegacyImport": false, "strictPreprocessor": true } ``` 2. 编译时检测: ```objectscript // 在类定义头部添加 #define STRICT_PREPROCESSOR 1 ``` 建议结合`%occInclude`宏进行现代化改造: ```objectscript #Include %occInclude #Define MOBGlobal ^PHA.OP.MOB ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值