检查函数参数的类型,C

时间:2016-01-26 03:13:15

标签: c function types arguments

假设我有一个接受int的函数:

void foo(int a) {
...
}

我可以在foo机构中包含哪些类型的检查,以确保传入的内容确实是int?就目前而言,如果我传入float例如,它只会被截断为int。拥有像Java instanceof关键字这样的东西会很棒,但我想这可能太过于希望了。

2 个答案:

答案 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)