宏函数表现得像循环一样

时间:2014-10-17 12:12:06

标签: c for-loop macros

考虑我设法编写的以下代码:

#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循环一样工作?

2 个答案:

答案 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

虽然注意到这些宏都不好或坏,但它们与典型函数没有相同的行为。