我正在尝试在C中实现方法重载,最好使用宏,以便标头/库可以处理定义和声明,而不是将其放在用户身上。现在,我已阅读有关使用answer的_Generic
,但是问题是我的函数具有struct
类型。因此,无法使用__typeof__
的_Generic
来评估其类型。我想知道是否有任何办法。
这是我的头文件的外观(这是我们应该关注的所有内容)-
#pragma once
// Macros for generic like use of the data structure
// Macros for the stack type itself
/*
* Define stack with corresponding type
* Converts Stack(int) to intstack_t
*/
#define Stack(type) type stack_t
// Macros for functions
/*
* Define createStack function
* Converts createStack(int, 5) to create_intstack(5)
*/
#define createStack(type, capacity) create_ ##type ##stack(capacity)
/*
* Define destroyStack function
* Converts destroyStack(someIntStack) to destroy_intstack(someIntStack)
* Where someIntStack is a pointer to a variable of type intstack_t
*/
#define destroyStack(stack) _Generic(stack, intstack_t*: destroy_intstack, charstack_t*: destroy_charstack)(stack)
/*
* Define push function
* Converts push(someIntStack, data) to intstack_push(someIntStack, data)
* Where someIntStack is a pointer to a variable of type intstack_t
*/
#define push(stack, data) _Generic(stack, intstack_t*: intstack_push, charstack_t*: charstack_push)(stack, data)
// Stack structure definition(s)
// int stack definition
typedef struct IntegerStack {
int top;
unsigned capacity;
int* arr;
}intstack_t;
// char stack definition
typedef struct CharacterStack {
int top;
unsigned capacity;
char* arr;
}charstack_t;
//Stack functions
// int stack functions
intstack_t* create_intstack(int);
void destroy_intstack(intstack_t*);
void intstack_push(intstack_t*, int);
// char stack functions
charstack_t* create_charstack(int);
void destroy_charstack(charstack_t*);
void charstack_push(charstack_t*, char);
大多数函数声明(以及间接的它们各自的宏)已被删除,因为它们基本上都具有相同的功能。我只关心提供的push
函数宏。其他宏确实可以显示我打算使用哪种用例。显然,在使用push
的_Generic
中使用的宏将不起作用,因为intstack_t
或charstack_t
不是原始类型。
目标是使用户能够使用push(stack, data)
,其中堆栈可以是intstack_t*
或charstack_t*
类型的变量,并且语句push(stack, data)
将转换为intstack_push(stack, data)
或charstack_push(stack, data)
分别。
_Generic
将与可变长度数组以外的任何完整类型一起使用。而且,尽管您不能在_Generic
调用中将不完整类型与值相关联,但指向不完整类型的指针没有问题。
因此,即使在push
和instack_t
不透明的上下文中使用,您的charstack_t
宏也可以正常工作。