【发布时间】:2011-07-06 08:49:23
【问题描述】:
假设我有一个这样定义的宏:
#define FOO(x,y) \ 做 { 整数a,b; a = f(x); b = g(x); y = a+b; } 而 (0)在扩展宏时,GCC 是否“保证”a、b 的任何唯一性?我的意思是,如果我以下列方式使用 FOO:
整数 a = 1, b = 2; FOO(a,b);之后,预处理这将是:
整数 a = 1, b = 2; 做 { 整数a,b; a = f(a); b = g(b); b = a+b; } 而 (0)编译器能否/将区分 do{} 外的 a 和 do 内的 a 吗?我可以使用什么技巧来保证任何类型的唯一性(除了让里面的变量有一个乱码,这样其他人就不太可能使用相同的名字)?
(理想情况下,函数会更有用,但我的特殊情况不允许这样做)
【问题讨论】:
-
不要将宏用于此类事情。我们有功能是有原因的。
-
@jleedev:卫生宏听起来是个好主意……为什么 gcc 没有实现这个?听起来实现起来很简单直接。 @ThiefMaster:同意函数将是理想的,但它们是不可能的,因为我不能为此添加公共函数。
-
您无法编写完全等效的函数,但您可以编写一个返回 a+b 的函数,而不是将其存储在 y 参数中。为什么你的情况不允许呢?
-
@R.D. gcc 是一个 C 编译器,实现了 C 标准指定的内容。它还实现了一些扩展,但这些扩展鼓励人们编写不可移植的代码;应该避免它们。