#define从C转换为C#

时间:2011-08-29 12:09:19

标签: c# c macros

这是C代码:

/* LERP(a,b,c) = linear interpolation macro, is 'a' when c == 0.0 and 'b' when c == 1.0 */
#define LERP(a,b,c)     (((b) - (a)) * (c) + (a))

http://www.brucelindbloom.com/index.html?Eqn_XYZ_to_T.html

等于这个C#代码?

private static double LERP(double a, double b, double c) { return (((b) - (a)) * (c) + (a)); }

6 个答案:

答案 0 :(得分:13)

没有。 请考虑以下事项:

LERP(x++,1,2);

c代码也可能有两次增加x的副作用[它是@phresnel所提到的未定义],而c#代码是完美定义的,并且只会增加x一次。

结果也可能不同,因为第一个a和第二个[在宏中]可能有不同的值,因为它可能在第一个中有所增加。

答案 1 :(得分:8)

答案 2 :(得分:5)

从技术上讲,不是他们不平等。 C宏可以采用任何类型:intfloatbyte等。

你的C#版只能处理double,没有显式的强制转换。您需要根据需要为其他类型添加重载。

答案 3 :(得分:2)

它基本相同,是的。你也可以摆脱一些括号:

private static double LERP(double a, double b, double c) { return (b - a) * c + a; }

答案 4 :(得分:2)

要获得你在C中所拥有的东西,你可以使用:

delegate double ValueGetter();
static double LERP(ValueGetter a, ValueGetter b, ValueGetter c) { return (b() - a()) * c() + a(); }

但我同意amit。这可能与你在C中的相同(但仅用于其他类型的双倍)仍然可能不是你真正想要的...(使用委托你可以将'i ++'设置为,而不仅仅是i ++的结果)

答案 5 :(得分:1)

是的,但你可以写得更简单:

return (b - a) * c + a;