考虑我设法编写的以下代码:
#include <stdio.h>
#define FOR(A, B, C) for(A; B; C++)
int main()
{
FOR(i=0, i<10, i)
printf("%i", i);
return 1;
}
输出是:
0123456789
如果我做FOR(i=5, i<10, i)
那么输出分别是56789
我的问题是合法的吗?它会在不同的情况下导致任何错误吗?它是否像for循环一样工作?
答案 0 :(得分:6)
是的,这是一个“合法”的宏,但不是,它不像真正的for
循环那样工作。
你的宏不会处理这个:
int a, b;
for(a = 0, b = 4711; a < b; ++a);
例如,,因为您无法区分用于构建较长初始化表达式的,
与用于分隔构成部分的表达式的表达式:
FOR(a = 0, b = 0, a < b, ++a);
将会中断,因为它看起来像是一个带有4个参数而不是3个参数的调用。
答案 1 :(得分:2)
宏只是在预处理器使用macro关键字看到的任何地方被复制。它只是复制文本,仅此而已。
再详细说明一下,请考虑以下示例:
#define MY_MACRO a
int MY_MACRO = 5;
当预处理器出现时,它将采用上述内容并将其更改为:
int a = 5;
然后编译器将出现并像普通的C / C ++代码一样编译它。
当您向宏添加参数时,它们只是在宏中替换。这可能是个问题,请考虑以下两个宏:
#define BAD_MACRO(a, b) a*b
#define GOOD_MACRO(a, b) (a)*(b)
它们看起来几乎相同,但请考虑以下因素:
int k = BAD_MACRO(2, 3); // k = 2*3 = 6
int j = GOOD_MACRO(2, 3); // j = 2*3 = 6
int m = BAD_MACRO(2+1, 3); // m = 2+1*3 = 5
int n = GOOD_MACRO(2+1, 3); // n = (2+1)*3 = 9
虽然注意到这些宏都不好或坏,但它们与典型函数没有相同的行为。