强制函数只接受特定的定义?

我想强制一个函数参数只接受特定的定义。 例如,考虑#define OUTPUT 1 ,# #define INPUT 0void restrictedFunction(int parameter);

我将如何强制restrictedFunction(int parameter)只接受OUTPUTINPUT

我还想考虑另一个定义可能具有相同的值,例如#define LEFT 1#define RIGHT 0

所以在这种情况下,我希望restrictedFunction(int parameter)能够仅接受OUTPUTINPUT


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

上一篇: Force function to accept specific definitions only?

下一篇: Does the compiler optimise structs of size 0?