我试图在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;
}
有人知道如何正确地做到这一点吗?
答案 0 :(得分:1)
更改GET_CONTRUCTOR_OVERLOAD,这样就可以处理4个参数并选择正确的函数:
#define GET_CONTRUCTOR_OVERLOAD(_1, _2, _3, _4, NAME, ...) NAME
在此处查看此行动:https://ideone.com/5Iobu1