试图根据参数的数量而不是类型在C中实现函数重载

时间:2016-04-17 20:03:46

标签: c macros

我试图在C中进行某种面向对象的编程。我遇到的一个问题是如何根据传递的参数数量来获取函数的重载。我不明白为什么,但是当我传递3个参数时,会调用contructor1。

编辑:添加了包含和结构定义,因此代码现在可以编译。

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct my_type_struct my_type;

void constructor1 ( my_type * object, uint16_t arg1 );
void constructor2 ( my_type * object, uint16_t arg1, uint16_t arg2 );
void constructor3 ( my_type * object, const void * const array_arg1, 
    uint16_t arg2, uint16_t arg3 );

#define GET_CONTRUCTOR_OVERLOAD(_1, _2, _3, NAME, ...) NAME
#define INIT_OBJECT(...) GET_CONTRUCTOR_OVERLOAD(__VA_ARGS__, \
    constructor3, constructor2, constructor1)(__VA_ARGS__)
#define CONSTRUCTOR(name, ...) my_type name; INIT_OBJECT(&name, __VA_ARGS__)

struct my_type_struct
{
    int field;
};

int main(int argc, char* argv[])
{
    int a[30];
    CONSTRUCTOR(obj, a, sizeof(int), 30);//invokes constructor1
}

void constructor1 ( my_type * object, uint16_t arg1 )
{
    printf("%s\n", __FUNCTION__);
    object->field = 1;
}
void constructor2 ( my_type * object, uint16_t arg1, uint16_t arg2 )
{
    printf("%s\n", __FUNCTION__);
    object->field = 2;
}
void constructor3 ( my_type * object, const void * const array_arg1, 
uint16_t arg2, uint16_t arg3 )
{
    printf("%s\n", __FUNCTION__);
    object->field = 3;
}

有人知道如何正确地做到这一点吗?

1 个答案:

答案 0 :(得分:1)

更改GET_CONTRUCTOR_OVERLOAD,这样就可以处理4个参数并选择正确的函数:

#define GET_CONTRUCTOR_OVERLOAD(_1, _2, _3, _4, NAME, ...) NAME

在此处查看此行动:https://ideone.com/5Iobu1