作者:是唐雨冰吗 | 来源:互联网 | 2023-05-22 12:29
宏swap
不是C函数,而不是预处理器插入宏作为是在宏调用的地方,所以代码如下所示:
if( i > j)
temp=i; i=j; j=temp;;
重新格式化代码后
if( i > j)
temp=i;
i=j;
j=temp;
;
只有分配temp
完成,如果条件为真,其他两个任务都始终做到无条件.
这可以通过两种方式解决:将宏调用放在语句块中:
if( i > j)
{
swap( i, j );
}
或者将宏体块设为块:
#define swap(a,b) do { temp=(a); (a)=(b); (b)=temp; } while (0)
将多语句宏放在do { ... } while (0)
语句中的约定是因为否则你得到一个空语句(就像你现在看到的那样,见上文),这可能会在扩展宏作为例如if else
语句的一部分时引起问题.
1> Some program..:
宏swap
不是C函数,而不是预处理器插入宏作为是在宏调用的地方,所以代码如下所示:
if( i > j)
temp=i; i=j; j=temp;;
重新格式化代码后
if( i > j)
temp=i;
i=j;
j=temp;
;
只有分配temp
完成,如果条件为真,其他两个任务都始终做到无条件.
这可以通过两种方式解决:将宏调用放在语句块中:
if( i > j)
{
swap( i, j );
}
或者将宏体块设为块:
#define swap(a,b) do { temp=(a); (a)=(b); (b)=temp; } while (0)
将多语句宏放在do { ... } while (0)
语句中的约定是因为否则你得到一个空语句(就像你现在看到的那样,见上文),这可能会在扩展宏作为例如if else
语句的一部分时引起问题.
感谢不要忽视`j = temp ;;`.:-)
@Quentin公平点...但这就是内联函数优于宏的原因之一; 但这是一个不同的故事.