C语言实现泛型

如何在C语言中实现简单的泛型编程(一) 题外话               鄙人最近在家里听斯坦福大学的开放课程——《编程范式Programming Paradigms》。 附上veryCD的资源下载地址: http://www.verycd.com/topics/2838268/         这个是英文授课,现在还是没有中文或英文字幕的。就课程来说非常不错。其中Lecture 4中讲到了一种在C语言中不用C++中的te 阅读详情

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);
}

C语言实现一个泛型容器 用C语言实现一个容器,可以装字符串、字符、数字、二进制数据, 其中每一个被装进的数据要附带一个唯一识别码( uid )。 int put_char(List *list, unsigned int uid, char c); int put_string(List *list, unsigned int uid, char *str); int put_integer(List *list, 阅读详情

相关推荐

C语言实现仿STL泛型链表的详细教程

void *data;// 指向节点数据的指针// 指向下一个节点的指针在这个结构体定义中,void *data是关键,它使得结构体可以指向任意类型的数据,从而实现泛型的功能。这种方式的一个主要好处是它提供了类型安全,因为它仍然要求在编译时明确数据类型,但它允许将不同类型的数据存储在同一个结构体类型中。在本章节中,我们探讨链表的基础操作,这包括如何开始一个链表以及何时结束一个链表的生命周期。我们将深入到每个函数的定义和实现细节,并解释其背后的原理。初始化链表是构建任何链表操作的基础。

weixin_42518334的博客 802

Libevent: 在C语言中实现泛型数据结构

窥探C语言中的实现泛型数据结构的技巧

u012342808的博客 900

CTL--泛型的数据结构

本程序利用c语言来实现c++中STL的功能,也就是利用C语言来实现泛型的数据结构,这个文件中只包含四种数据结构,stack,queue,list,vector

C语言泛型数据结构模板(C语言泛型链表(list)、泛型队列(queue)、泛型栈(stack)、泛型数组(array))

前面时间我讲了c语言的泛型结构和this指针实现,这次我写了几个常用的数据结构通用模板。 国内下载: https://gitee.com/xunanmu/c_language_template.git github下载: https://github.com/xunanmu/c_language_template.git 文件层次 注意: 此源码只适用于gcc编译器!!! 注意: ...

qq_37822482的博客 2794

网格聚类 Grid Clustering/Grid-based Clustering

本文主要简单介绍了网格聚类的基本概念,优缺点,应用场景,建模时的注意事项,评价指标,实现方法,python示例和模型参数等。

JasonH2021的博客 4828

从理论到板级:FOC电机驱动硬件电路全链路设计解析

本文从硬件工程师视角,深度解析FOC电机驱动从理论到板级实现的全链路设计。重点剖析了电源保护、核心采样电路、三相逆变桥与驱动电路等关键硬件模块的设计要点与实战经验,强调硬件是FOC算法可靠运行的基石,并提供了PCB布局布线的核心原则,帮助开发者构建高性能、高可靠性的电机驱动硬件平台。

weixin_29240711的博客 333

C 语言泛型数组实现

typedef struct { // element byte size int stride; // element number int length; // memory data void* data; } Array; data是个指针,需要malloc申请动态内存。对,这里面放的是数组的数据。好的,那么现在数据有了,那

把理性与逻辑灌入电光石火奔腾流淌的指令集…… 2027

从OVITO可视化到LAMMPS计算:ATOMSK堆垛层错模型的全流程避坑指南

本文提供了一份从ATOMSK建模、OVITO可视化诊断到LAMMPS计算的堆垛层错模型全流程实战指南。重点解析了构建“计算友好”模型的核心矛盾,并详细演示了如何通过添加真空层、原子包裹和能量最小化等关键步骤,规避周期性边界条件带来的非物理相互作用,确保广义层错能计算的可靠性与可复现性。

v4w5x6的博客 266

【C语言】C语言实现泛型编程

泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。 这里提供一种方法,通过空指针类型void* 现交换两个元素内容的函数 swap #include <stdio.h> /** \brief 交换arg1与arg2的值使用空指针类型来实现泛型, * * \param arg1 -- 空指针类型,指向需要交换的数据类型 * \param arg2 -- 空指针类型,指向需要交换的数据类型 * \param type -- 需要交换

熠熠L的博客 2031

Android应用开发从零到一:基于Kotlin与Jetpack Compose的完整实践指南

移动应用开发的核心在于构建一个架构清晰、可维护且可扩展的应用基础。理解应用架构的原理,如关注点分离和数据驱动UI,是实现高质量应用的关键技术价值。在现代Android开发中,Kotlin语言凭借其空安全特性和协程,能有效提升代码的健壮性与开发效率。Jetpack Compose作为声明式UI框架,代表了UI开发的未来方向,与Kotlin协程深度集成,简化了复杂交互界面的构建。这些技术共同服务于个人任务管理、企业工具等多种应用场景。本文以构建一个完整的个人任务管理应用为例,系统阐述从环境搭建、UI构建、数据持

weixin_32667955的博客 313

【QT开发教程】Qt中的数据加密与解密

在现代应用程序中,数据加密与解密是保护敏感信息的重要手段。Qt本身并不直接提供数据加密与解密的支持,但可以使用第三方库,如OpenSSL或Crypto++,来实现这一功能。本文将介绍如何在Qt中使用OpenSSL进行数据加密与解密,包括基本概念、使用方法以及一些实际的示例。

科技改变人类,技术成就未来 1156

C语言泛型编程--抽象数据类型

一、数据类型:       在任何编程语言中,数据类型作为一个整体,ANSI-C包含的类型为:int、double、char……,程序员很少满意语言本身提供的数据类型,一个简单的办法就是构造类似:array、struct 或union。       那么,什么是数据类型呢?我们可以这样定义:一种数据类型是一些值的集合——通常char类型共有256不同的值,int有更多,double也包含更多的...

weixin_34357962的博客 489

【2024年5月备考新增】《2024高项论文精华版(5)项目工作绩效域和度量绩效域》

3、专注于工作过程和能力。③专注于工作过程和能力。1、制定有效的度量指标。2、度量内容及相应指标。3、展示度量信息和结果。4、管理沟通和参与。7、监督新工作和变更。①制定有效的度量指标。②度量内容及相应指标。③展示度量信息和结果。5、基于度量进行诊断。

Else 的博客 1268

【C语言】【泛型】C语言技巧之如何实现泛型

- 本文简要介绍了C语言实现泛型的方法及几个典型的使用案例。

一介草民,只为生活。 1567

SAP HANA 的一个王炸技能,Smart Data Access

SAP HANA Cloud近期推出Knowledge Graph Engine(KGE),支持RDF三元组存储和SPARQL查询,与向量引擎等组件协同实现混合检索。同时文章介绍了HANA的Smart Data Access(SDA)功能,它通过虚拟表技术实现跨系统联邦查询,支持30+种数据源(不包括PostgreSQL),适用于混合云场景。SDA通过谓词下推优化性能,典型应用包括冷热数据分层和跨系统报表分析。对于PostgreSQL连接需求,建议使用HANA的Smart Data Integration方

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 498

新凯来嵌入式面经及参考答案

利用编译器预定义宏判断目标架构,如。

大模型大数据攻城狮的专栏 2065

原来C语言还可以这样实现“泛型编程”!

在回答标题问题之前,先了解下什么是泛型编程。泛型编程(generic programming)是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指...

轻松学C语言 2194

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

使用C语言实现“泛型”链表

看到这个标题,你可能非常惊讶,C语言也能实现泛型链表?我们知道链表是我们非常常用的数据结构,但是在C中却没有像C++中的STL那样有一个list的模板类,那么我们是否可以用C语言实现一个像STL中的list那样的泛型链表呢?答案是肯定的。下面就以本人的一个用C语言设计的链表为例子,来分析说明一下本人的设计和实现要点,希望能给你一点有用的帮助。 一、所用的链表类型的选择 我们知道,链表也

ljianhui的专栏 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C语言实现泛型队列

泛型队列(C语言实现) 队列结构体 typedef struct Aqueue { void *data[MAXQUEUE]; //数据域 int front; int rear; size_t length; //队列长度 //一个节点可存放不同的数据 int type[MAXQUEUE]; //存放进入队列...

huange7的博客 2171

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C语言实现泛型 C11关键字_Generic

  在 C11 标准中,_Generic 关键字让 C 语言如同 C++ 等面向对象程序设计语言一样,支持轻量级的泛型编程设计。 1 泛型是什么   泛型编程(generic programming)是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。   C++通过模板来支持泛型编程,比如下面这段代码,在定义add()函数时候并没有明确指出其返回类型、参数类型。 #include <iostream> temp

qq_37151416的博客 7689

C语言实现泛型编程

C语言实现泛型编程 分类编程技术 泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。在 C 语言中,可以通过一些手段实现这样的泛型编程。这里介绍一种方法——通过无类型指针void*。 看下面的一个实现交换两个元素内容的函数 swap,以整型 int 为例: void swap(int* i1,int* i2){ int temp; temp = *i1; *i1 = *i2; ..

qq_20312079的博客 443

C语言实现泛型vector容器

vector 是什么? vector收录在STL(C++标准库)里,是一种特殊的数据结构,名字叫做“动态数组”或者“不定长数组”,有时也被翻译成“容器”。其实就是一种非静态数组,可以进行修改、增长。 vector简单用法 vector<int>test;//建立一个vector test.push_back(1); test.push_back(2);//把1和2压入vector这...

SuperBvs的博客 8801

C语言中的泛型编程如何实现?

指针、宏、函数指针、结构体和抽象数据类型等技术,可以实现泛型编程,使代码能够处理不同数据类型。C语言是一种非常强大且广泛使用的编程语言,但它在语法和特性上相对较为底层,缺乏一些高级语言提供的抽象和泛型编程特性。在C语言中,可以使用结构体和函数指针来模拟ADT,以实现泛型编程。因此,在使用宏时,要格外小心,确保不会导致不可预测的行为。然后,我们使用相应的推入函数将元素推入栈中,最后使用弹出函数弹出并打印栈中的元素。总结:泛型编程是一种在C语言中实现通用代码的方法,可以提高代码的重用性和可维护性。

weixin_68551689的博客 1312

C语言也可以实现泛型(转)

原文地址:https://www.cnblogs.com/wuyudong/p/c-general-function1.html #include<string.h> #include<stdio.h> // C 语言也可以实现一定的泛型编程,但这样是不安全的,系统对其只有有限的检查。在编程时一定要多加细心。 /*变量是不能声明为 void 无类型的。而你不知道调用此函数传进的参数是什么类型的,无法确定一种类型的声明。 同时,不能将 * 用在无类型指针上,因为系统没有此地址指向对象大

weixin_44001521的博客 1204

c语言 泛型链表,c语言是怎么实现泛型链表

c语言是如何实现泛型链表最近有看一点Linux内核源码,发现内核里大量使用了list_head结构体。百度查了一下,原来内核利用这个结构体实现了泛型。自认为对链表已经很熟悉的我,决定自己实现一下。下面以Node和list_head为例。上图就是循环链大致思路了。(画的不好)我们通过list_head对链表进行移动操作。这里存在几个问题:首先通过list_head得到的指针,它指向的list_hea...

weixin_29133151的博客 333

C语言实现泛型和函数重载

前言 通常情况下,C语言并不具备泛型及重载功能。而指针赋予了C语言无限的可能,本文中所描述的C语言泛型及函数重载,就是在大量使用指针下实现的。本文以实现基本数据结构链表为例,围绕两个核心 void* 和不定参数展开。 链表有关的结构体 typedef struct _dualNode { void* value; struct _dualNode * pre; struct _dualNode * next; }DualNode; typedef struct { int

dxx_1776的博客 1871
上一篇: Java类的初始化流程
下一篇: 随手记(C & C++)
abcfrom0
博客等级 码龄14年 3粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值