回答
逗号是一个会阻止代码编译的错误:我会认为这是一个错字。
考虑:
#define EQ(a, b) ((a) == (b))
定义一个宏等于运算符==
。
使用这个宏的代码后,你可以输入,例如:
if (EQ(2+2, 4))
代替:
if (2+2 == 4)
不是很有用,真的。
这意味着什么:这个代码是不合格的。紧跟在#define
之后的令牌必须是标识符,而,
则不是。
如果要删除,
,则会定义一个名称为EQ
的function-like macro,它带有两个参数。
让我们一步一步来
#define MAX 10
这将通过10在你的代码文件替换单词“MAX”的每一个实例。这非常像定义一个具有一个主要区别的常量变量。 #define语句的解释在编译之前完成。这有助于示例将MAX用作数组大小。如果你使用了一个变量,那么在很多情况下会导致编译器错误。
您可以在Linux终端中使用cpp <filename.c>
命令来查看宏执行时会发生什么。
为例验证码:
#define MAX 10
int numbers[MAX];
预处理后(即预处理宏的解释)
int numbers[10];
注意#define语句将消失一次解释。
这把我们带到另一个例子
#define square(x) (x * x)
在我们的代码square(x)
每个实例,不仅将(x * x)
所取代,而且x的值将被替换。其中有类似功能的减速效果,但是这又是不同的
所以
square(5)
将(5 * 5)
最后,我们的例子
#define, EQ(a, b) ((a) == (b))
这将取代EQ(a, b)
每一个实例来代替((a) == (b))
举个例子
EQ(4, 5)
将((4) == (5))
现在更换什么是 “==” 是什么意思?如果4和5相等,则“检查是否相等”整个表达式将评估为1(这显然不是真实的),因此该表达式最终将被评估为0.
其中或多或少像的效果这个功能
int EQ(int a, int b)
{
return (a == b);
}
这可能是也写成
int EQ(int a, int b)
{
if (a ==b) return 1;
if (a !=b) return 0;
}
注意,与宏我们避免了二次变量的声明并没有函数调用真的,这是一般的曲icker。如果您的处理器速度较慢(或微处理器),则这一优势显而易见。
最后让我状态明显
#define simple_macro 5
int some_integer_variable = 10;
.
.
.
some_integer_variable = simple_macro;
simple_macro = 12; /* illegal statement */
simple_macro++; /* illegal statement */
因为运行预处理后,这将是
int some_integer_variable = 10;
.
.
.
some_integer_variable = 5;
5 = 12;
5 ++;
哦!可能我说得太多,但让我离开你这个(明显)代码
#define MAX 10
int variable = MAX; /*this is a MAX variable */
char some_string[] = "the MAX value"; /* no replacement will happen here */
int variable_MAX; /* no replacement will happen here */
运行的预编译后会
int variable = 10;
char some_string[] = "the MAX value";
int variable_MAX;
你'#定义方(x)(x * x)'例子是避免宏的一个很好的理由。 'square(4 + 2)'的结果是什么? 36或14?并且,通过优化,像double square(double d){return d * d; }'可以内联,因此不会比宏的更慢(但更安全)。 – stefaanv 2012-08-08 09:09:35
在这种情况下,您可能需要使用大量的括号:-)。我个人不喜欢宏。功能更易于保持阅读和理解,并且不易出错。对于大多数具有当今处理能力以及编译器成熟度的应用程序,我认为在许多情况下代码质量方面的成本高于优化代码的成本。 – 2012-08-08 09:43:37
- 1. `size * = b - a`是什么意思?
- 2. 数据( - >)a b是什么意思?
- 3. `a> b`是什么意思?
- 4. 操作c = a +++ b是什么意思?
- 5. a >> = b是什么意思?
- 6. `a + = b + = c`是什么意思?
- 7. “特质A <:B”是什么意思?
- 8. format(a,str(b))是什么意思?
- 9. b = a-> b是什么意思在一类列表中?
- 10. 什么是A&B代表.Aggregate((a,b)=>声明w/a&b)
- 11. 这是什么意思在Javascript中:a = a | b
- 12. 逗号代表的意思是:a,b = b,a?
- 13. a + = b和a = + b之间的区别是什么,a ++和++ a?
- 14. a,b = b,a + b和a = b,b = a + b在fibonacci中的区别是什么[Python]
- 15. A == B对B == A,有什么区别
- 16. 输入(a + b)** 2,输出a * a + a * b + b * a + b * b
- 17. scala - 什么地图[(A,B)]是什么意思?
- 18. a = a + b和a + = b之间的区别是什么?
- 19. “a = a || []”是什么意思?
- 20. 为什么a.compareTo(b)等于compareTo(a,b)或a.method(b)= method(a,b)?
- 21. 为什么is_(a,b)函数比python 2.7.3中的eq(a,b)更快?
- 22. Python a,b = b,a + b
- 23. Coq:如何证明“a = b - > nat_compare a b = Eq。”?
- 24. Neon指令,vsub_f32(a,b),是a-b还是b-a?
- 25. 从{a-b,b-c,c-a}改变为{(a,b),(b,c),(c,a)}?
- 26. 混合两个矢量:[a a]和[b b] to [a b a b]
- 27. 在matlab中,a =(b == c)是什么意思?
- 28. Ruby中的语法[* a..b]是什么意思?
- 29. ($ a,$ b,$ c)= @array在Perl中是什么意思?
- 30. 在Python中,dict.pop(a,b)是什么意思?
是啊,我意识到,我的错字...... – ryantata 2012-08-10 08:06:51