我有以下功能(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;无论我处理角度还是西红柿都很重要。)
答案 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会导致细微的错误。