Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
2d890c63
D
Docs
项目概览
OpenHarmony
/
Docs
大约 2 年 前同步成功
通知
161
Star
293
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
2d890c63
编写于
8月 18, 2023
作者:
J
jqknono
提交者:
Gitee
8月 18, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update zh-cn/contribute/OpenHarmony-cpp-coding-style-guide.md.
编译预处理段落添加必要的换行, 移除多余的行尾空格. Signed-off-by:
N
jqknono
<
jqknono@outlook.com
>
上级
41d6c63c
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
17 addition
and
15 deletion
+17
-15
zh-cn/contribute/OpenHarmony-cpp-coding-style-guide.md
zh-cn/contribute/OpenHarmony-cpp-coding-style-guide.md
+17
-15
未找到文件。
zh-cn/contribute/OpenHarmony-cpp-coding-style-guide.md
浏览文件 @
2d890c63
...
@@ -508,11 +508,12 @@ int&p = i; // Bad
...
@@ -508,11 +508,12 @@ int&p = i; // Bad
### <a name="r3-13-2"></a>规则3.13.2 避免使用宏
### <a name="r3-13-2"></a>规则3.13.2 避免使用宏
宏会忽略作用域,类型系统以及各种规则,容易引发问题。应尽量避免使用宏定义,如果必须使用宏,要保证证宏名的唯一性。
宏会忽略作用域,类型系统以及各种规则,容易引发问题。应尽量避免使用宏定义,如果必须使用宏,要保证证宏名的唯一性。
在C++中,有许多方式来避免使用宏:
在C++中,有许多方式来避免使用宏:
-
用const或enum定义易于理解的常量
-
用const或enum定义易于理解的常量
-
用namespace避免名字冲突
-
用namespace避免名字冲突
-
用inline函数避免函数调用的开销
-
用inline函数避免函数调用的开销
-
用template函数来处理多种类型
-
用template函数来处理多种类型
在文件头保护宏、条件编译、日志记录等必要场景中可以使用宏。
在文件头保护宏、条件编译、日志记录等必要场景中可以使用宏。
### <a name="r3-13-3"></a>规则3.13.3 禁止使用宏来表示常量
### <a name="r3-13-3"></a>规则3.13.3 禁止使用宏来表示常量
...
@@ -520,23 +521,24 @@ int&p = i; // Bad
...
@@ -520,23 +521,24 @@ int&p = i; // Bad
### <a name="r3-13-4"></a>规则3.13.4 禁止使用函数式宏
### <a name="r3-13-4"></a>规则3.13.4 禁止使用函数式宏
宏义函数式宏前,应考虑能否用函数替代。对于可替代场景,建议用函数替代宏。
宏义函数式宏前,应考虑能否用函数替代。对于可替代场景,建议用函数替代宏。
函数式宏的缺点如下:
函数式宏的缺点如下:
-
函数式宏缺乏类型检查,不如函数调用检查严格
-
函数式宏缺乏类型检查,不如函数调用检查严格
-
宏展开时宏参数不求值,可能会产生非预期结果
-
宏展开时宏参数不求值,可能会产生非预期结果
-
宏没有独立的作用域
-
宏没有独立的作用域
-
宏的技巧性太强,例如#的用法和无处不在的括号,影响可读性
-
宏的技巧性太强,例如#的用法和无处不在的括号,影响可读性
-
在特定场景中必须用编译器对宏的扩展语法,如GCC的statement expression,影响可移植性
-
在特定场景中必须用编译器对宏的扩展语法,如GCC的statement expression,影响可移植性
-
宏在预编译阶段展开后,在期后编译、链接和调试时都不可见;而且包含多行的宏会展开为一行。函数式宏难以调试、难以打断点,不利于定位问题
-
宏在预编译阶段展开后,在期后编译、链接和调试时都不可见;而且包含多行的宏会展开为一行。函数式宏难以调试、难以打断点,不利于定位问题
-
对于包含大量语句的宏,在每个调用点都要展开。如果调用点很多,会造成代码空间的膨胀
-
对于包含大量语句的宏,在每个调用点都要展开。如果调用点很多,会造成代码空间的膨胀
函数没有宏的上述缺点。但是,函数相比宏,最大的劣势是执行效率不高(增加函数调用的开销和编译器优化的难度)。
函数没有宏的上述缺点。但是,函数相比宏,最大的劣势是执行效率不高(增加函数调用的开销和编译器优化的难度)。
为此,可以在必要时使用内联函数。内联函数跟宏类似,也是在调用点展开。不同之处在于内联函数是在编译时展开。
为此,可以在必要时使用内联函数。内联函数跟宏类似,也是在调用点展开。不同之处在于内联函数是在编译时展开。
内联函数兼具函数和宏的优点:
内联函数兼具函数和宏的优点:
-
内联函数执行严格的类型检查
-
内联函数执行严格的类型检查
-
内联函数的参数求值只会进行一次
-
内联函数的参数求值只会进行一次
-
内联函数就地展开,没有函数调用的开销
-
内联函数就地展开,没有函数调用的开销
-
内联函数比函数优化得更好
-
内联函数比函数优化得更好
对于性能要求高的产品代码,可以考虑用内联函数代替函数。
对于性能要求高的产品代码,可以考虑用内联函数代替函数。
例外:
例外:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录