C语言 通用值初始化分配器



搞乱/学习C。 我想要一个单行代码来将堆栈值移动到堆中,这是我能想到的最好的。

#define defheapify(nm, T, sz) 
T* heapify_##nm (const T x) { 
T *nx = malloc(sz); 
nx[0] = x; 
return nx; 
}
defheapify(char, char, sizeof(char));
defheapify(uchar, unsigned char, sizeof(unsigned char));
defheapify(short_int, short int, sizeof(short int));
defheapify(ushort_int, unsigned short int, sizeof(unsigned short int));
defheapify(int, int, sizeof(int));
defheapify(uint, unsigned int, sizeof(unsigned int));
defheapify(long_int, long int, sizeof(long int));
defheapify(ulong_int, unsigned long int, sizeof(unsigned long int));
defheapify(long_long_int, long long int, sizeof(long long int));
defheapify(ulong_long_int, unsigned long long int, sizeof(unsigned long long int));
defheapify(float, float, sizeof(float));
defheapify(double, double, sizeof(double));
defheapify(long_double, long double, sizeof(long double));

它似乎有效:

short int *si = heapify_short_int(20);
printf("%dn", ((int*)si)[0]); /* => 20 */

有没有更好的方法来实现这一目标?

由于这是 C:

void * heapify (const void *p, size_t sz) {
void *x = malloc(sz);
if (x) memcpy(x, p, sz);
return x;
}

然后,如果您坚持:

#define defheapify(nm, T, sz) 
T* heapify_##nm (const T x) { return heapify(&x, sz); }

但是,如果您有Tsz是多余的,因此:

#define defheapify(nm, T) 
T* heapify_##nm (const T x) { return heapify(&x, sizeof(x)); }

但是,如果您只关心问题中列出的类型,则可以改用_Generic开关并简化界面。使用下面的代码,您可以删除确定正在处理的变量或常量类型的任务。只是总是打电话给heapify_any.

#define heapify_T(T, X) 
(T *)heapify(&(struct{ T x; }){X}.x, sizeof(T))
#define heapify_G(T, X) T:heapify_T(T, X)
#define heapify_any(X) _Generic( 
X, 
heapify_G(_Bool, X), 
heapify_G(char, X), 
heapify_G(signed char, X), 
heapify_G(unsigned char, X), 
heapify_G(short int, X), 
heapify_G(unsigned short int, X), 
heapify_G(int, X), 
heapify_G(unsigned int, X), 
heapify_G(long int, X), 
heapify_G(unsigned long int, X), 
heapify_G(long long int, X), 
heapify_G(unsigned long long int, X), 
heapify_G(float, X), 
heapify_G(double, X), 
heapify_G(long double, X), 
default:(void)0 
)

在 C 中没有文字short(或char_Bool(值这样的东西,因此您需要一个变量或强制转换才能使用上面的heapify_any宏。

short int *si = heapify_any((short)20);
printf("%hdn", *si);

在线试用!

相关内容

  • 没有找到相关文章

最新更新