![]() |
1
30
您不仅应该在参数周围放置parens,还应该在返回的表达式周围放置parens。
最好的规则是 仅在没有其他方法可用时使用#定义! 我知道你是在问C而不是C++,但还是要记住他。 |
![]() |
2
29
此表格具有以下优点:
|
![]() |
3
10
和 围绕展开列表中提到的每个参数:
避免编写多次计算其参数的宏。当参数有副作用时,此类宏的行为将不符合预期:
将评估
对宏使用大写名称,以明确它是一个宏而不是一个函数,这样就可以相应地考虑差异(另一个常见的良好做法是不向函数传递有副作用的参数)。 不要使用宏重命名以下类型:
因为当有人打字时,它的行为不会像预期的那样
|
![]() |
4
6
对于常量值、整型值或其他值,请使用静态常量值而不是宏。编译器通常可以对它们进行优化,它们仍然是语言类型系统中的第一类公民。
|
![]() |
5
5
在展开式中,在参数周围加上括号,这样,如果它们传入表达式,您将获得预期的行为。
|
![]() |
6
5
|
![]() |
7
2
为宏使用相当唯一的名称,因为它们具有全局范围,并且可能与任何内容冲突,因此:
我见过这样的情况,这种冲突不会产生编译错误,但会生成稍有错误的代码,因此它可能相当隐蔽。 |
![]() |
8
2
对于多行宏,请使用
你做了什么
会失败的。 另外,在宏中引入临时变量时要小心:
将打印
|
![]() |
9
2
取消定义宏。
你的
|
![]() |
10
1
如果您细心且专业,则可以通过使用宏作为简单的代码生成器来完成干代码(不要重复自己的代码)。你必须向其他程序员解释你在做什么,但这可以节省很多代码。例如,列表宏技术:
现在,如果您想添加一个新变量、删除一个变量或重命名一个变量,它是一个单行编辑。 |
![]() |
11
0
总是这样说:
|
![]() |
Timo · 如果宏变量后跟构成有效标识符的字符,则不会展开宏变量 7 年前 |
![]() |
user3623498 · 在#if中更改变量时出现问题 7 年前 |
![]() |
einpoklum · 来自#cmakedefine替换的意外结果 7 年前 |
![]() |
Joseph Franciscus · C中预处理器方法的别名++ 7 年前 |
![]() |
stoper · 防止同一宏在多个转换单元中具有不同的定义 7 年前 |
![]() |
СеÑгей · MinGW中预处理器g++的奇怪行为 7 年前 |