强制函数只接受特定的定义?
我想强制一个函数参数只接受特定的定义。 例如,考虑#define OUTPUT 1
,# #define INPUT 0
和void restrictedFunction(int parameter);
。
我将如何强制restrictedFunction(int parameter)
只接受OUTPUT
或INPUT
?
我还想考虑另一个定义可能具有相同的值,例如#define LEFT 1
和#define RIGHT 0
。
所以在这种情况下,我希望restrictedFunction(int parameter)
能够仅接受OUTPUT
和INPUT
。
typedef enum { INPUT = 0, OUTPUT = 1 } IO_Type;
void restrictedFunction(IO_Type parameter) { ... }
它并不绝对强制使用这些值(编译器会让某人编写restrictedFunction(4)
),但它大致和你一样好。
如果你真的想强制正确的类型,那么:
typedef enum { INPUT = 0, OUTPUT = 1 } IO_Type;
typedef struct { IO_Type io_type } IO_Param;
void restrictedFunction(IO_Param parameter) { ... }
在C99或更高版本中,您可以通过以下方式进行调用:
restrictedFunction((IO_Param){ INPUT });
这是一个复合文字,在飞行中创建一个结构。 这种结构类型真的不是很清楚,但它会迫使用户稍微思考一下,并且可能会改善编译器在错误使用时的诊断(但它们可能使用restrictedFunction((IO_Param){ 4 });
仍然)。
这意味着你的restrictedFunction()
代码应该准备好验证参数:
void restrictedFunction(IO_Type io_type)
{
switch (io_type)
{
case INPUT:
...do input handling...
break;
case OUTPUT:
...do output handling...
break;
default:
assert(io_type != INPUT && io_type != OUTPUT);
...or other error handling...
break;
}
}
你可以使用枚举。
typedef enum TrafficDirection { INPUT = 0, OUTPUT = 1 } TrafficDirection;
restrictedFunction(TrafficDirection direction);
当然,这并不完美。 只要你使用强制转换,你仍然可以传递任何int。
restrictedFunction((TrafficDirection) 4);
你没有得到尽可能多的保护,但你可以这样做:
enum func_type { INPUT, OUTPUT };
void restrictedFunction( enum func_type parameter );
链接地址: http://www.djcxy.com/p/73567.html