【发布时间】:2013-07-25 19:04:59
【问题描述】:
我正在寻找一种将以下函数结构转换为宏的方法。我知道,这是一个愚蠢且毫无意义的例子,但它说明了这一点,因为我无法给出我的实际源代码。
int foo(int x, int y)
{
do
{
--x;
++y;
}while(x > y);
return x * y; //note that x and y have changed values here.
}
这样我就可以在 main 或其他函数中调用该函数,如下所示:
int next_x = foo(x,y);
我似乎无法在这里得到 100% 正确的语法。这是我糟糕的尝试:
#define FOO(x,y) \
( \
do \
{ \
--x; \
++y; \
}while(x < y), \
x \
)
最后 x 的原因是,理论上我可以做到这一点
int next_x = FOO(x,y);
但是,我得到一个语法错误,我不知道为什么。任何帮助将不胜感激。
================================================
附加信息
我还应该注意,我还有其他相应结构的宏:
#define INIT(x,y)
(
x = //something,
y = //something
)
#define NEXT_INT(x,y) \
( \
INIT(x,y), \
get_next_num(x,y) \ //Note, this is an inline function call , not a macro.
)
#define NEXT_FLOAT(x,y,temp) \
( \
temp = NEXT_INT(x,y), \
temp ? temp * 1.23456 : FLT_MIN \
)
所以,我可以并且已经做了以下事情:
float my_flt = NEXT_FLOAT(x,y,temp);
【问题讨论】:
-
我对宏的模糊记忆告诉我它们需要全部在一行上。
-
这里没有真正好的答案,这可能很好。否则人们会认为这是一个好主意,并且会更频繁地这样做。您的 C 编译器是否不支持“内联”(我认为它符合 C99 标准)?我能看到这样做的唯一原因是创建 C++ 模板的宏版本。请不要。一些可怜的维持工程师会拿你的生命合同。
-
避免内联函数的目的是什么?
-
@audiFanatic:您假设内联函数的性能很差,但我不清楚您是否真的在系统上看到了问题。除非您有不允许在编译器上启用优化的要求(或编译器产生质量很差的优化),否则出于您陈述的原因,没有必要更喜欢宏而不是内联函数。
-
@RossPresser 不,你可以用 \ 告诉计算机“下一行仍然是 marco 的一部分”
标签: c syntax do-while c-preprocessor