#include #import @class 讲解

本文详细解析了C++中#include与#import的区别,解释了如何避免重复引用错误,并阐述了@class的使用场景。重点在于理解C++头文件引用的优化方式。
#include
区分 #include <x.h>与#include "x.h"的作用
#include <x.h>:它用于对系统自带的头文件的引用,编译器会在系统文件目录下去查找该文件.
#include "x.h":用户自定义的文件用双引号引用,编译器首先会在用户目录下查找,然后到安装目录中查找,最后在系统文件中查找。

在使用#include的时候要注意处理重复引用(这也是objc中#include与#import的区别)
例如:ClassA 与 ClassB同时引用了ClassC,不做重复引用处理的时候在ClassD中同时引用ClassA,ClassB编译会提示对ClassC重复引用的错误.
我们可以:#ifndef _CLASSC_H
#define _CLASSC_H
#include "ClassC"
#endif
这样处理在编译时就不会有重复引用的错误出现(在objc中#import解决了这个问题,这是它们的区别)

#import
#import 大部分功能和#include是一样的,但是他处理了重复引用的问题,我们在引用文件的时候不用再去自己进行重复引用处理.

@class
主要是用于声明一个类,告诉编译器它后面的名字是一个类的名字,而这个类的定义实现是暂时不用知道的,后面会告诉你.也是因为在@class仅仅只是声明一个类,所以在后面的实现文件里面是需要去#import这个类,这时候才包含了这个被引用的类的所有信息。

综上所述#include,#import与@class的区别可以做一下理解:

#include与#import在引用一个类的时候会包含这个类的所有信息包括变量方法等,但是这样做会对编译效率造成影响.比如有100个类都#import了ClassA,那么在编译的时候这100个类都会去对ClassA处理.又比如A被B引用,B被C引用,C被D引用.....此时如果A被修改,那么后面的B,C,D.....都需要重新进行编译.还有一个用法会引起编译错误的就是在ClassA中#import ClassB 在ClassB中#import ClassA那么在编译的时候也会出现未知错误。

所以一般来说,在interface中引用一个类,就用@class,它会把这个类作为一个类型来使用,而在实现这个interface的文件中,如果需要引用这个类的实体变量或者方法之类的,还是需要import这个在@class中声明的类。

原文:http://fei263.blog.163.com/blog/static/927937242012219103649197/

在编程语言(尤其是 C/C++)中,正确识别 **注释** 和 **预处理指令(以 `#` 开头)** 是代码分析、语法高亮、静态检查等工具的关键步骤。我们来详细讲解如何判定它们,并给出 Python 实现代码。 --- ## ✅ 一、基本概念区分 | 类型 | 标志 | 示例 | 特点 | |------|------|------|------| | **单行注释** | `//` | `// 这是注释` | C++/Java 风格,从 `//` 到行尾 | | **多行注释** | `/* ... */` | `/* 跨行注释 */` | C 风格,可跨行 | | **预处理指令** | `#` 开头 | `#include <stdio.h>` | 编译前处理,不在语句中 | > ⚠️ 注意:`#` 不是注释!它是预处理命令的开始(如宏定义、包含头文件) --- ## ✅ 二、判断是否为注释或 `#` 行的逻辑 ### 🧩 目标: 给定一行文本 `line`,判断它是否属于以下三类之一: 1. 单行注释(`//`) 2. 多行注释的一部分(`/* ... */`) 3. 预处理指令(以 `#` 开头且不是字符串或注释中的 `#`) --- ## ✅ 三、Python 实现代码 ```python import re def classify_line(line): """ 判断一行是:普通代码 / 注释 / 预处理指令 返回: 'code', 'comment', 'preprocessor' """ stripped = line.strip() # 排除空行 if not stripped: return 'comment' # 或视为无关 # 1. 是否为预处理指令(# 开头,且不在字符串或注释中) if stripped.startswith('#'): return 'preprocessor' # 2. 是否为单行注释 if '//' in stripped: # 检查 // 是否在字符串中 code_part = re.split(r'"[^"]*"', stripped)[0] # 忽略引号内 if '//' in code_part: return 'comment' # 3. 是否为多行注释的一部分 if '/*' in stripped or '*/' in stripped: # 简化处理:只要包含 /* 或 */ 就认为是注释 return 'comment' # 4. 检查是否完全在多行注释中间(上下文相关) # (更复杂,需状态机,见下文扩展) return 'code' # 测试示例 test_lines = [ "int a = 42;", # code "// this is a comment", # comment "printf(\"hello // not a comment\");", # code "/* multi-line comment */", # comment "/* still in comment", # comment (起始) "*/ end comment", # comment (结束) "#include <stdio.h>", # preprocessor "#define MAX 100", # preprocessor 'char *p = "#not-preprocessor";' # code ] print("分类结果:") for line in test_lines: result = classify_line(line) print(f"{result:<12} : {line}") ``` --- ## ✅ 四、改进版:支持跨行注释的状态机 由于 `/* ... */` 可能跨越多行,需要维护一个“是否在注释中”的状态: ```python class CommentHandler: def __init__(self): self.in_multiline_comment = False def process_line(self, line): original_line = line stripped = line.strip() if self.in_multiline_comment: if '*/' in line: self.in_multiline_comment = False return 'comment' else: # 检查是否进入多行注释 if '/*' in line: if '*/' in line[line.index('/*'):]: return 'comment' # 同行结束 else: self.in_multiline_comment = True return 'comment' # 检查单行注释(排除字符串内的) if '//' in line: # 分割字符串部分 parts = re.split(r'"[^"]*"', line) for part in parts: if '//' in part: return 'comment' # 检查预处理器 if stripped.startswith('#'): return 'preprocessor' return 'code' # 使用示例 handler = CommentHandler() lines = [ "int main() {", " /* this is a", " multi-line comment */", " printf(\"hello\");", " // another comment", "#ifdef DEBUG", " return 0;", "}" ] print("\n带状态的处理结果:") for i, line in enumerate(lines): result = handler.process_line(line) print(f"Line {i+1}: {result} -> {line}") ``` --- ## ✅ 五、常见误区与注意事项 | 错误 | 正确做法 | |------|----------| | 把所有 `#` 当成注释 | `#include`, `#define` 是预处理指令,不是注释 | | 把字符串里的 `//` 当成注释 | `"// not a comment"` 应该是代码 | | 忽视 `/* */` 跨行问题 | 需要用状态变量跟踪是否处于注释中 | | 使用 `in` 直接判断而不考虑上下文 | 容易误判 | --- ## ✅ 六、正则表达式增强版(精确匹配) ```python # 匹配非字符串内的 // def has_real_single_line_comment(line): # 移除双引号内容后再看是否有 // clean = re.sub(r'"[^"]*"', '', line) return '//' in clean # 匹配预处理器(# 在行首,忽略空格) def is_preprocessor(line): return bool(re.match(r'^\s*#', line)) # 匹配多行注释开始或结束 def is_multiline_comment_fragment(line): return '/*' in line or '*/' in line ``` --- ## ✅ 总结 | 判定目标 | 方法 | |--------|------| | 是否为 `#` 行 | `line.strip().startswith('#')` | | 是否为单行注释 | `//` 出现在非字符串部分 | | 是否为多行注释 | 使用状态机跟踪 `/* ... */` | | 是否为有效代码行 | 排除以上三类后才是代码 | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值