C 函数与乘法的宏组合

C 函数与乘法的宏组合,c,function,macros,return-value,C,Function,Macros,Return Value,我有以下函数(bool只是一个#define bool int宏): 它返回两个二维向量之间的角度(结果存储在角度中)。我决定为我的函数使用一个返回“布尔”值,该值将用于检查操作是否成功,并且仅当它是true(在我的例子中是#define true 1))时,才会检查传递的参数所包含的内容。我或多或少是被迫这样做的,因为有些操作可能会失败,而且据我所知,C中没有例外,这似乎是解决这种情况的最佳方法。在v2dAngleRad(…)中,唯一可能出错的是,如果传递了对v2d1和/或v2d2的无效引用,

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

它返回两个二维向量之间的角度(结果存储在
角度
中)。我决定为我的函数使用一个返回“布尔”值,该值将用于检查操作是否成功,并且仅当它是
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))

我知道这看起来很愚蠢,实际上我可能会为此编写一个单独的函数,但我仍然想知道如何处理这样的函数。但是,如果您确实希望委托,可以使用内联函数:

static inline bool v2dAngleRad(Vector2D* v2d1, Vector2D* v2d2, double* angle)
{
    if ( ! v2dAngleDeg(v2d1, v2d2, angle) )
         return false;

    *angle *= 180/M_PI;
    return true;
}
可以使用多行预处理器宏来代替,但是这不太可靠。用于比较两种方法

由于C99
inline
是该语言的一部分,但即使在C89编译器上,它们中的大多数对
inline
等效关键字或属性也有某种支持。当然,您不必使它成为一个内联函数,您可以将一个非内联声明放在头文件中,并将此定义放在某个源文件中


注意。考虑使用<代码>包含< <代码>,而不是滚动自己的布尔。使用
int
破解bool可能会导致微妙的错误。

如果函数的实现很简单,那么只制作一个不引用
v2dAngleDeg
v2dAngleRad
函数可能更容易。但是,如果您确实希望委托,可以使用内联函数:

static inline bool v2dAngleRad(Vector2D* v2d1, Vector2D* v2d2, double* angle)
{
    if ( ! v2dAngleDeg(v2d1, v2d2, angle) )
         return false;

    *angle *= 180/M_PI;
    return true;
}
可以使用多行预处理器宏来代替,但是这不太可靠。用于比较两种方法

由于C99
inline
是该语言的一部分,但即使在C89编译器上,它们中的大多数对
inline
等效关键字或属性也有某种支持。当然,您不必使它成为一个内联函数,您可以将一个非内联声明放在头文件中,并将此定义放在某个源文件中


注意。考虑使用<代码>包含< <代码>,而不是滚动自己的布尔。使用
int
破解bool可能会导致一些微妙的bug。

我看不出有任何理由在这里使用宏。如果函数可以执行,请不要使用宏。如果您不信任您的编译器,请将函数
内联
。哦,谢谢!我甚至不知道他们在标准库中包含了类似的内容。如果是这样的话,你可能想先读一本现代C语言的书<代码>\u Bool
resp。宏
bool
是17年来的标准配置。想想你还错过了什么。。。e、 g.
内联
函数。@Olaf你是对的,但正如我在文章中提到的,我只想知道这是否可能,如果可能的话,如何做到。弧度到度数的转换正是让我抓狂的原因。没别的了。您可以将该函数视为
intfoo(int*x)
“我只是想知道它是否可行”-是的,您可以随时射击您的脚。我的评论是关于良好实践的。因此,它致力于提高代码质量,而不是告诉ppl如何更好地拍摄他们的脚。我看不出有任何理由在这里使用宏。如果函数可以执行,请不要使用宏。如果您不信任您的编译器,请将函数
内联
。哦,谢谢!我甚至不知道他们在标准库中包含了类似的内容。如果是这样的话,你可能想先读一本现代C语言的书<代码>\u Bool
resp。宏
bool
是17年来的标准配置。想想你还错过了什么。。。e、 g.
内联
函数。@Olaf你是对的,但正如我在文章中提到的,我只想知道这是否可能,如果可能的话,如何做到。弧度到度数的转换正是让我抓狂的原因。没别的了。您可以将该函数视为
intfoo(int*x)
“我只是想知道它是否可行”-是的,您可以随时射击您的脚。我的评论是关于良好实践的。因此,该公司致力于提高代码质量,而不是告诉ppl如何做好准备。