宏 - 函数和乘法之间的组合

时间:2016-10-16 23:34:43

标签: c function macros return-value

我有以下功能(bool只是一个#define bool int宏):

bool v2dAngleRad(Vector2D* v2d1, Vector2D* v2d2, double* angle);

它返回两个2D矢量之间的角度(结果存储在angle中)。我决定使用return" boolean"我的函数的值,用于检查操作是否成功,并且仅当它true(在我的情况下为#define true 1;))时,将检查传递的参数它们包含什么。由于某些操作失败的可能性,我或多或少被迫这样做,因为C中没有例外,据我所知这似乎是解决这种情况的最佳方法。在v2dAngleRad(...)中唯一可能出错的是,如果传递了对v2d1和/或v2d2的无效引用,则我希望返回false

除此之外,我想使用一个宏(只是为了刷新我的记忆,但也可能稍后用其他功能做事)来处理转换到度。我想定义以下宏:

#define v2dAngleDeg(v2d1, v2d2, angle) ... // angle*180./M_PI

问题在于,由于我的函数的定义方式(返回值和作为指向它的指针传递的参数),我无法找到如何在宏定义中使用angle的方法在函数调用填充之后将其转换为度数。还应该对布尔返回值进行额外检查,并且只有在操作成功的情况下才能进行转换。

如果我的功能是这样的

double v2dAngleRad(Vector2D* v2d1, Vector2D* v2d2);

返回我原本可以做的角度

#define v2dAngleDeg(v2d1, v2d2) (v2dAngleRad(v2d1, v2d2)*(180.0/M_PI))

我知道这可能看起来很愚蠢,我实际上可能会为此编写一个单独的函数,但我仍然想知道如何处理这样的函数一般(并且&n #39;无论我处理角度还是西红柿都很重要。)

1 个答案:

答案 0 :(得分:0)

如果函数的实现很简单,那么创建一个不引用v2dAngleRad的{​​{1}}函数可能更容易。但是如果你想要委托,你可以使用内联函数:

v2dAngleDeg

可以使用多行预处理器宏,但是不太健壮。 See this thread用于比较两种方法。

由于C99 static inline bool v2dAngleRad(Vector2D* v2d1, Vector2D* v2d2, double* angle) { if ( ! v2dAngleDeg(v2d1, v2d2, angle) ) return false; *angle *= 180/M_PI; return true; } 是语言的一部分,但即使在C89编译器上,它们中的大多数都对inline - 等效的关键字或属性有某种支持。当然,您不必将其作为内联函数,您可以在标题中放置非内联声明,并将此定义放在某个源文件中。

NB。考虑使用standard inline而不是滚动自己的bool。使用#include <stdbool.h>来破解bool会导致细微的错误。