C语言实现泛型

本文探讨了C语言中实现泛型编程的几种方法,包括使用函数指针、void*指针以及宏编程等手段来实现通用算法和数据结构。通过具体的代码示例介绍了如何根据不同数据类型调整打印格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言理论上并不支持泛型编程,因此对于一些通用算法通常都采用函数指针+void *强制类型转换来实现,但是对于一些数据结构,并不支持类似C++的标准库的各种通用结构的实现。

想要实现相应的效果,还可以采用宏编程来实现,同普通的函数不同,宏扩展可以忽视类型信息,从而简化用户使用。

可以学习/usr/include/tgmath.h中的写法。


采用void *指针加上sizeof数据类型大小来得到类型的方法要考虑不同机器上的数据大小不同,非常麻烦。


现在还没弄明白宏的写法

帖一点自己写的有问题的代码

#include <stdio.h>
#include "debug_util.h"

#define Iprint_array(array, size) \
{int i;                      \
     printf("array_elements = [\n"); \
     for (i = 0; i < size; ++i) { \
         if( i && i%8 == 0) putchar('\n'); \
         char *strformat =                                   \
            (sizeof(*array) == sizeof(double) ? "%.6d," :    \
             sizeof(*array) == sizeof(long long) ? "%lld," : \
             sizeof(*array) == sizeof(long) ? "%ld," : "%d," \
            );                                              \
         printf(strformat, array[i]);                       \
     }                                                      \
     printf("\b]\n");                                       \
}

void print_array(void *array, int size) {
    int i;

         char *strformat =    
            (sizeof(*array) == sizeof(double) ? "%.6d," :    
             sizeof(*array) == sizeof(long long) ? "%lld," : 
             sizeof(*array) == sizeof(long) ? "%ld," : "%d," 
            );  
    printf("array_elements = [\n");
    for (i = 0; i < size; ++i) {
        if ( i && i%8 == 0 ) 
            putchar('\n');
    
         if (sizeof(*array) == sizeof(double)) {
             printf(strformat, *(double *)(array+i*8));
         } else if (sizeof(*array) == sizeof(long long)) {
             printf(strformat, *(long long *)(array+i*4));
         } else if (sizeof(*array) == sizeof(long)) {
             printf(strformat, *(long *)(array+i*4));
         } else {
             printf(strformat, *(int *)(array+i*4));
         }   
    //  printf("%d,", array[i]);
    }   
    printf("\b]\n");

//  Iprint_array(array, size);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值