gpt4 book ai didi

c - 宏——函数与乘法的结合

转载 作者:太空宇宙 更新时间:2023-11-04 04:27:30 26 4
gpt4 key购买 nike

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

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

它返回两个二维 vector 之间的角度(结果存储在 angle 中)。我决定为我的函数使用返回“ bool ”值,该值将用于检查操作是否成功,并且仅当它为 true 时(在我的例子中为 #define true 1 ;)) 传递的参数将被检查它们包含的内容。由于某些操作可能会失败,并且据我所知,C 中没有异常,我或多或少被迫这样做,这似乎是解决这种情况的最佳方法。在 v2dAngleRad(...) 中,唯一可能出错的是如果传递了对 v2d1 和/或 v2d2 的无效引用,其中如果我想返回 false

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

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

问题是,由于我的函数定义方式(返回值和参数作为指向它的指针传递),我无法弄清楚如何使用 angle在函数调用填充后将其转换为度数的宏定义。还应该对 bool 返回值进行额外检查,并且只有在操作成功时才​​必须进行转换。

如果我的函数是这样的

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

那是返回我本来可以做的角度

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

我知道这可能看起来很愚蠢,我实际上可能会为此编写一个单独的函数,但我仍然想知道如何一般处理这样的函数(不不管我是处理角还是西红柿)。

最佳答案

如果函数的实现很简单,那么制作一个 v2dAngleRad 可能会更容易。不引用 v2dAngleDeg 的函数.但是如果你确实想委托(delegate),你可以使用内联函数:

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

*angle *= 180/M_PI;
return true;
}

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

自 C99 inline是语言的一部分,但即使在 C89 编译器上,它们中的大多数都对 inline 有某种支持- 等效关键字或属性。当然你不必把它做成一个内联函数,你可以在头文件中放置一个非内联声明,然后把这个定义放在源文件的某个地方。

注意。考虑使用 standard #include <stdbool.h>而不是滚动自己的 bool 值。使用 int破解 bool 值可能会导致细微的错误。

关于c - 宏——函数与乘法的结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40076665/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com