- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有以下功能(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/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!