首页 > 其他分享 >借用gcc内置函数帮助C来实现函数重载

借用gcc内置函数帮助C来实现函数重载

时间:2023-04-10 19:55:14浏览次数:43  
标签:load __ gcc 函数 s2 over 重载 s1 struct

借用gcc内置函数__builtin_choose_expr__builtin_types_compatible_p可以帮助c来实现函数重载。

首先对这两个函数功能做下介绍

__builtin_choose_expr(expr,expr1,expr2)与c语言:?运算符有些类似,如果expr表达式为真,那么返回expr1,否则返回expr2

_builtin_types_compatible_p(type1,type2)测试type1与type2是否相同,如果相同返回真,否则返回假

#include <stdio.h>

struct s1
{
    int a;
    int b;
};

struct s2
{
    double a;
    double b;
};

void over_load_s1(struct s1 s)
{
    printf("This is over_load_s1\n");
}

void over_load_s2(struct s2 s)
{
    printf("This is over_load_s2\n");
}
/*下面的宏定义主要使用了__builtin_choose_expr里嵌套了另一个__built_in_choose_expr函数
如果类型为struct s1,则返回over_load_s1的调用结果,如果类型为struct s2,则返回over_loads2的调用结果,否则显示出错信息*/
#define over_load(A)\
    __builtin_choose_expr(__builtin_types_compatible_p(typeof(A), struct s1),\
             over_load_s1(*(struct s1 *)&A),\
    __builtin_choose_expr(__builtin_types_compatible_p(typeof(A), struct s2), \
              over_load_s2(*(struct s2 *)&A),\
    printf("don't support this type parameter,please check again\n")))

int main()
{
    struct s1 s1 = {1, 2};
    struct s2 s2 = {1.1, 2.2};
    over_load(s1);
    over_load(s2);
    over_load(2);
}

运行结果如下:

 

标签:load,__,gcc,函数,s2,over,重载,s1,struct
From: https://www.cnblogs.com/imreW/p/17304116.html

相关文章

  • JS函数的副作用你了解过吗?
    原文链接:   https://note.noxussj.top/?source=51cto什么是副作用?副作用会让一个函数变的不纯,纯函数是根据相同的输入返回相同的输出,如果函数依赖于外部的状态就无法保证输出相同,就会带来副作用。副作用来源函数依赖外部状态(变量),但是副作用不可能完全禁止,尽可能控制在它们可控范......
  • C++ 性能优化 - for循环条件中不要调用函数
    for循环条件中调用普通函数#include<iostream>#include<chrono>usingnamespacestd;longlongcount=0;constintN=10;intgetSize(){cout<<"getsize"<<endl;returnN+1;}voidtimeMeasure(void(*f)()){autobeg......
  • 使用lambda表达式来给函数传递参数
    self.combo_box2.Bind(wx.EVT_TEXT_ENTER,self.on_text_change)绑定了事件和on_text_change函数;怎么在这个绑定操作中给on_text_change函数传递一个参数呢?需要传递的参数就是这个控件本身(self.combo_box2)。在on_text_change函数中又该怎么取用呢?接下来举例说明如何处理:在绑......
  • 练习4-1 编写一个函数strrindex(s, t),用于返回字符串t在s中最右出现的位置,如果 s中不
    #include<stdio.h>#include<string.h>intstrrindex(chars[],chart[]){inti,j,k;intlen=strlen(s);for(i=len-1;i>=0;i++){for(j=i,k=0;t[k]!=0&&s[j]==t[k];j++,k++);if(k>0&......
  • 函数声明、函数原型、函数定义
    定义”是指对函数功能的确立,包括指定函数名,函数值类型、形参类型、函数体等,它是一个完整的、独立的函数单位。而“声明”的作用则是把函数的名字、函数类型以及形参类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查(例如函数名是否正确,实参与形参的类型和个数......
  • 使用ChatGPT写一个GDALDatasetRasterIOEx功能增强函数
    GDALDatasetRasterIOEx函数是GDAL用来读取栅格数据文件像素数据的函数,默认是不支持参数传入的读取窗口范围超出栅格的实际范围的,但是很多时候,需要按照地理范围读取,就会有超出栅格范围的情况。之前我常用的做法,就是创建一个基于Mem的VRT(虚拟栅格),VRT的地理范围取自己想要读取的......
  • C++派生类里析构函数和构造函数的调用顺序
    C++派生类里析构函数和构造函数的调用顺序1.定义一个哺乳类Mammal,在由此派生出狗类Dog,定义一个Dog类的对象,观察基类和派生类的构造函数与析构函数的调用顺序。#include<bits/stdc++.h>usingnamespacestd;classMammal{public: Mammal(){ cout<<"constructedM"<<e......
  • Go 语言函数闭包
    Go语言支持匿名函数,可作为闭包。匿名函数是一个"内联"语句或表达式。匿名函数的优越性在于可以直接使用函数内的变量,不必申明。以下实例中,我们创建了函数getSequence(),返回另外一个函数。该函数的目的是在闭包中递增i变量,代码如下:实例package mainimport "fmt"func ge......
  • 【ACM博弈论】SG函数入门(1):从巴什博奕到尼姆游戏
    在我小时候以前做题的时候,遇到博弈题往往都是漫无目的地打表找规律,或者找一些特殊情况但是没有很好的分析方法。其实博弈题是有比较套路的解题方法的,那就是利用SG函数,第一节不会讲到SG函数的具体用法,我们先来博弈入个门,学习一下最基本的博弈类型:Nim游戏。......
  • 命令式编程\声明式编程\函数式编程
    命令式编程(Imperative):详细的命令机器怎么(How)去处理一件事情以达到你想要的结果(What);声明式编程(Declarative):只告诉你想要的结果(What),机器自己摸索过程(How)。命令式编程是我们一步一步告诉机器需要怎么做,机器按部就班地执行命令。声明式编程是我们告诉机器我想要这样的结果,而不管他是怎......