C-使用宏使用不同结构类型参数的方法重载

问题描述 投票:1回答:1

我正在尝试在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_tcharstack_t不是原始类型。

目标是使用户能够使用push(stack, data),其中堆栈可以是intstack_t*charstack_t*类型的变量,并且语句push(stack, data)将转换为intstack_push(stack, data)charstack_push(stack, data)分别。

c struct macros c-preprocessor
1个回答
0
投票

_Generic将与可变长度数组以外的任何完整类型一起使用。而且,尽管您不能在_Generic调用中将不完整类型与值相关联,但指向不完整类型的指针没有问题。

因此,即使在pushinstack_t不透明的上下文中使用,您的charstack_t宏也可以正常工作。

大肠杆菌样品:http://coliru.stacked-crooked.com/a/f4ce3f718e2953fc

© www.soinside.com 2019 - 2024. All rights reserved.