假设我有一个接受int的函数:
void foo(int a) {
...
}
我可以在foo
机构中包含哪些类型的检查,以确保传入的内容确实是int
?就目前而言,如果我传入float
例如,它只会被截断为int
。拥有像Java instanceof
关键字这样的东西会很棒,但我想这可能太过于希望了。
答案 0 :(得分:2)
一旦将浮点值转换为整数,就无法在运行时执行任何操作来查找实际参数的类型。但是,你可以做的是让编译器在使用浮点值调用 foo 时发出警告。
示例:
/*test.c*/
void foo(int a)
{
}
int main(void)
{
foo(3.14);
return 0;
}
如果您使用GCC,可以添加选项-Wconversion
:
$ gcc -Wconversion test.c
test.c: In function ‘main’:
test.c:10:9: warning: conversion to ‘int’ alters ‘double’ constant value [-Wfloat-conversion]
foo(3.14);
^
其他编译器通常也有类似的选项。
答案 1 :(得分:0)
使用_Generic()
(C11)区分调用的函数。
void foo_i(int a) {
...
}
void foo_f(float f) {
if (f < INT_MIN) Handle_OutOfRange();
if (f >= INT_MAX+1.0f) Handle_OutOfRange();
if ((int)f != f) Handle_OutOfRange();
foo_i(f);
}
#define foo(X) _Generic((X), \
float: foo_f, \
int: foo_i
)(X)