type 相关的几个试验

1.概要

typeid是一个操作符,它用于在运行时获取关于数据类型的信息。

在C语言中,类型定义(Type Definition)通常是通过使用关键字如 typedef 来创建新的类型名称(也称为类型别名),这些新的类型名称可以代表已存在的数据类型、结构体(struct)、联合体(union)或枚举(enum)等。 

2.代码

#include <iostream>
using namespace std;//typeid试验
namespace test1 {class  A{};void main() {const type_info& type = typeid(A);cout << type.name() << endl;}
}
//typedef试验
namespace test2 {//的应用场景有哪些typedef int myInt;typedef int (*My_fun)(int a, int b);int fun(int a, int b) {return a + b;}void main() {myInt a = 5;My_fun f = fun;int c = f(3, 5);cout << c << endl;}
}
//sizeof试验
namespace test3 {class  A{};class  B{int a;};class  C{int a;int b;};class  D{int a;int b;int fun(int a, int b) {return a + b;}};void main() {int a = 5;int b = sizeof(a);cout << b << endl;b = sizeof(A);cout << b << endl;b = sizeof(B);cout << b << endl;b = sizeof(C);cout << b << endl;b = sizeof(D);cout << b << endl;}
}
int main()
{test1::main();test2::main();test3::main();cout << "Hello World!\n";
}

3.运行结果

class test1::A
8
4
1
4
8
8
Hello World!

4.补充

1.c typeid

 

在C++中,typeid是一个操作符,它用于在运行时获取关于数据类型的信息。这是C++的RTTI(运行时类型识别)机制的一部分。typeid可以返回一个type_info对象的引用,该对象封装了有关数据类型的信息。

以下是一些关于typeid的要点:

  1. 用法typeid(expression) 或 typeid(type-name)

    • expression是一个表达式,其类型将被确定。
    • type-name是一个类型名称(如intMyClass等)。
  2. 注意typeid只能用于多态上下文中的指针或引用。如果你对一个非多态类型或值使用typeid,它将直接返回该类型的type_info,而不会进行任何动态解析。

  3. dynamic_cast一起使用:在多态环境中,typeiddynamic_cast通常一起使用来确保类型转换的安全性。

  4. 示例

#include <iostream>
#include <typeinfo>
class Base {
public:
virtual ~Base() {}
};
class Derived : public Base {};
int main() {
Base* basePtr = new Derived();
// 使用 typeid 检查指针所指向的对象的实际类型
if (typeid(*basePtr) == typeid(Derived)) {
std::cout << "It's a Derived object!" << std::endl;
} else {
std::cout << "It's not a Derived object!" << std::endl;
}
delete basePtr;
return 0;
}

在这个示例中,由于Base有一个虚析构函数(使其成为多态类型),所以我们可以使用typeid来检查basePtr实际指向的对象类型。

但是,如果你尝试对不是通过指针或引用访问的多态类型使用typeid,它将不会返回你期望的结果,因为它不会进行动态类型解析。

2.typeid的返回值是啥 

typeid操作符在C++中返回一个对std::type_info对象的引用,该对象封装了有关数据类型的信息。std::type_info是一个在<typeinfo>头文件中定义的类,它包含了关于数据类型(如名称、是否是指针或引用等)的元信息。

std::type_info类的主要用途是允许程序在运行时查询有关数据类型的信息,但请注意,这个信息通常不包括类型的完整名称(例如,它不会返回如"int""MyClass"这样的字符串),而是返回一个能够唯一标识类型的内部标识符。

你可以使用std::type_info的成员函数name()来获取类型的名称,但返回的字符串格式是特定于实现的,并且可能不是人类可读的。通常,这个字符串主要用于调试和诊断目的,而不是用于显示给用户。

此外,std::type_info还提供了operator==()operator!=()来比较两个类型信息对象是否相同。

下面是一个简单的示例,展示了如何使用typeidstd::type_info

#include <iostream>
#include <typeinfo>
int main() {
int a = 0;
double b = 0.0;
// 获取a和b的类型信息
const std::type_info& info_a = typeid(a);
const std::type_info& info_b = typeid(b);
// 输出类型信息的名称(但注意这可能是编译器特定的)
std::cout << "Type of a: " << info_a.name() << std::endl;
std::cout << "Type of b: " << info_b.name() << std::endl;
// 比较两个类型信息对象是否相同
if (info_a == info_b) {
std::cout << "a and b are of the same type." << std::endl;
} else {
std::cout << "a and b are of different types." << std::endl;
}
return 0;
}

在这个示例中,info_a.name()info_b.name()将输出编译器特定的类型名称字符串,这些字符串可能不是人类可读的。而类型比较将正确地指出ab是不同类型的。

 

3.c 类型定义 

在C语言中,类型定义(Type Definition)通常是通过使用关键字如 typedef 来创建新的类型名称(也称为类型别名),这些新的类型名称可以代表已存在的数据类型、结构体(struct)、联合体(union)或枚举(enum)等。

使用 typedef 定义类型别名

typedef 关键字用于为已有的数据类型定义一个新的名称。这可以使代码更易于阅读和维护,特别是当使用复杂的数据类型时。

示例 1:为整数类型定义别名
typedef int Integer;
Integer a = 10; // 相当于 int a = 10;
示例 2:为结构体定义别名
typedef struct {
int x;
int y;
} Point;
Point p; // 创建一个Point类型的变量p
p.x = 10;
p.y = 20;

结构体(Struct)

结构体是一种复合数据类型,允许你将多个不同类型的数据组合成一个单一的类型。

struct Person {
char name[50];
int age;
};
struct Person person1; // 创建一个Person类型的变量person1
strcpy(person1.name, "Alice");
person1.age = 30;

联合体(Union)

联合体是一种特殊的数据结构,允许你在相同的内存位置存储不同的数据类型。但是,在任何时候,联合体只能存储其中一种类型的数据。

union Data {
int i;
float f;
char str[20];
};
union Data data;
data.i = 10; // 现在data存储一个整数
// ...
data.f = 220.5; // 现在data存储一个浮点数,之前存储的整数被覆盖

枚举(Enum)

枚举是一种用户定义的数据类型,它包含一组命名的整数值。默认情况下,枚举中的第一个枚举符的值为0,后面每个枚举符的值比前一个枚举符的值大1。但是,你也可以显式地为枚举符指定整数值。

enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
enum Days today = Mon; // today的值为1(假设Sun的值为0)

4.c 判断一个变量的类型 

在C语言中,与C++的typeid操作符不同,没有直接的方式来查询一个变量的类型并在运行时输出其类型名称。但是,你可以通过编写一些宏或函数来模拟这种功能,尽管这些方法通常不如C++中的typeid那样强大和灵活。

一种常见的方法是使用_Generic关键字(在C11及更高版本中可用),它允许你根据表达式的类型来选择不同的结果。但是,_Generic主要用于在编译时基于类型做出决策,而不是在运行时查询类型。

不过,你可以通过创建一些宏来模拟类型检查,但这些宏通常只能用于有限的一组类型,并且不能提供完整的类型名称。以下是一个简单的示例,该示例展示了如何使用宏来检查一个变量是否为整数类型:

#include <stdio.h>
#define IS_INT(x) _Generic((x), int: 1, default: 0)
int main() {
int a = 5;
float b = 3.14;
if (IS_INT(a)) {
printf("a is an integer.\n");
} else {
printf("a is not an integer.\n");
}
if (IS_INT(b)) {
printf("b is an integer.\n");
} else {
printf("b is not an integer.\n");
}
return 0;
}

在这个例子中,IS_INT宏使用_Generic来检查其参数是否为int类型。如果是,则返回1;否则返回0。然后,你可以根据这个宏的返回值来编写条件语句。

但是,请注意这种方法只能用于有限的一组类型,并且不能用于检查所有可能的类型。此外,它也不能提供关于类型的完整信息(如类型名称)。

如果你需要在C语言中实现更复杂的类型检查或类型信息获取功能,你可能需要考虑使用其他编程语言或工具,或者设计一种适合你特定需求的解决方案。在某些情况下,你可能需要手动跟踪和管理类型信息,以便在运行时使用。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/24350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于自动化工具autox.js的抢票(猫眼)

1.看到朋友圈抢周杰伦、林俊杰演唱会票贼难信息&#xff0c;特研究了一段时间&#xff0c;用autox.js写了自动化抢票脚本&#xff0c;购票页面自动点击下单&#xff08;仅限安卓手机&#xff09;。 2.脚本运行图 3.前期准备工作 &#xff08;1&#xff09;autox.js社区官网&am…

DNF手游攻略:主C职业推荐,云手机强力辅助!

在《地下城与勇士》手游中&#xff0c;你是否厌倦了重复刷图和无休止的手动操作&#xff1f;利用VMOS云手机&#xff0c;你可以一键解决这些烦恼&#xff0c;实现自动打怪、一机多开&#xff0c;让游戏变得更加轻松愉快。下面我们将介绍如何使用VMOS云手机&#xff0c;以及推荐…

卫生间装修10个避坑细节

雅静说卫生装修,记住这10条不后悔      卫生间装不好,漏水,臭,很麻烦      1先检查下水管,防止小黑虫和漏水      它里面必须要有皮垫密封圈,,看完以后把它拧紧      防止后期漏水还得砸瓷砖      2,改水电的时候留够插座,马桶一个      浴室柜的灯提前…

0109__strip(1) command

strip(1) command_linux strip-CSDN博客

MySQL-Explain使用

MySQL-Explain使用 type列 type列 这一列表示关联类型或访问类型&#xff0c;即MySQL决定如何查找表中的行&#xff0c;查找数据行记录的大概范围。 依次从最优到最差分别为&#xff1a;system > const > eq_ref > ref > range > index > ALL 一般来说&…

现代信号处理复习笔记(一)简答题

本文仅作为复习参考。 1、简述卡尔曼滤波和维纳滤波的关系。 在线性时不变系统和加性白噪声的情况下,卡尔曼滤波进入稳态值之后,等价于因果的维纳滤波。在一些情况下,卡尔曼滤波的状态更新方程和协方差更新方程与维纳滤波的滤波方程是一致的,因此可以将卡尔曼滤波看作是维…

Python入门!这些你都知道吗?

Python的基本介绍 Python是由荷兰人吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;于1990年代初设计的一门编程语言&#xff0c;作为ABC语言的替代品。它提供了高效的高级数据结构&#xff0c;并且能简单有效地进行面向对象编程。Python的语法简洁、易读&#xff0c;并…

rk3568 norflash+pcei nvme 配置

文章目录 rk3568 norflashpcei nvme 配置1&#xff0c;添加parameter_nor.txt文件2 修改编译规则3 修改uboot4 修改BoardConfig.mk5 修改kernel pcei配置6 编译7 烧录 rk3568 norflashpcei nvme 配置 1&#xff0c;添加parameter_nor.txt文件 device/rockchip/rk356x/rk3568_…

查询数据库每张表的记录数和数据大小的方法(不含索引)

1、手残方法 自己写脚本&#xff0c;不会利用元数据表和只会简单sql的解决办法&#xff1a; # cat loop_db_tables.sh #!/bin/bashdbnamesmysql -uroot -ppassword -e "show databases;" for dbname in $dbnames do# 由于是借用了shell&#xff0c;所以需要处理输…

git commit rule

git commit rule feat: 新功能 fix: bug修复 docs: 仅文档更改 style: 不影响代码含义的更改&#xff08;空白、格式设置、缺失 分号等&#xff09; refactor: 既不修复bug也不添加特性的代码更改 perf: 改进性能的代码更改 test: 添加缺少的测试或更正现有测试 chore: 对构建…

【学习笔记】Windows GDI绘图(十三)动画播放ImageAnimator(可调速)

文章目录 前言定义方法CanAnimate 是否可动画显示Animate 动画显示多帧图像UpdateFramesStopAnimate终止动画Image.GetFrameCount 获取动画总帧数Image.GetPropertyItem(0x5100) 获取帧延迟 自定义GIF播放(可调速) 前言 在前一篇文章中用到ImageAnimator获取了GIF动画的一些属…

vue3 监听器,组合式API的watch用法

watch函数 在组合式 API 中&#xff0c;我们可以使用 watch 函数在每次响应式状态发生变化时触发回调函数 watch(ref,callback&#xff08;newValue,oldValue&#xff09;&#xff0c;option:{}) ref:被监听的响应式量&#xff0c;可以是一个 ref (包括计算属性)、一个响应式…

STM32—按键控制LED(定时器)

目录 1 、 电路构成及原理图 2 、编写实现代码 main.c exit.c 3、代码讲解 4、烧录到开发板调试、验证代码 5、检验效果 此笔记基于朗峰 STM32F103 系列全集成开发板的记录。 1 、 电路构成及原理图 EXTI&#xff08;External interrupt/event controller&#xff…

查询SQL02:寻找用户推荐人

问题描述 找出那些 没有被 id 2 的客户 推荐 的客户的姓名。 以 任意顺序 返回结果表。 结果格式如下所示。 题目分析&#xff1a; 这题主要是要看这null值会不会用&#xff0c;如果说Java玩多了&#xff0c;你去写SQL时就会有问题。在SQL中判断是不是null值用的是is null或…

泛微开发修炼之旅--10基于Ecology实现附件上传,并将上传后的文件id存入表单附件控件中的示例及源码

文章链接&#xff1a;泛微开发修炼之旅--10基于Ecology实现附件上传&#xff0c;并将上传后的文件id存入表单附件控件中的示例及源码

tomcat10部署踩坑记录-公网IP和服务器系统IP搞混

1. 服务器基本条件 使用的阿里云服务器&#xff0c;镜像系统是Ubuntu16.04java version “17.0.11” 2024-04-16 LTS装的是tomcat10.1.24阿里云服务器安全组放行了&#xff1a;8080端口 服务器防火墙关闭&#xff1a; 监听情况和下图一样&#xff1a; tomcat正常启动&#xff…

MySQL进阶——索引使用规则

在上篇文章我们学习了MySQL进阶——索引&#xff0c;这篇文章学习MySQL进阶——索引使用规则。 索引使用规则 在使用索引时&#xff0c;需要遵守一些使用规则&#xff0c;否则索引会部分失效或全部失效。 最左前缀法则 最左前缀法则是查询从索引的最左列开始&#xff0c;并…

Vxe UI vxe-form 实现折叠表单,当表单很多时实现自动收起与展开

Vxe UI vue vxe-form 实现折叠表单&#xff0c;当表单很多时实现自动收起与展开 代码 folding 用于将当前表单项设置为默认隐藏 collapse-node 设置折叠按钮&#xff0c;加上之后会自动在该表单项的右侧显示一个折叠按钮 <template><div><vxe-formtitle-colo…

谷歌上架防关联,打包环境到底是不是关联因素之一?

在Google play上架应用&#xff0c;防关联是开发者们最关注的问题之一&#xff0c;只要开发者账号被谷歌审核系统与其它违规的开发者账号或应用存在关联&#xff0c;就很有可能被封号。 如果账号被封了&#xff0c;通常谷歌的封号通知邮件里只是写了因为关联或高风险、多次违规…

kafka-生产者拦截器(SpringBoot整合Kafka)

文章目录 1、生产者拦截器1.1、创建生产者拦截器1.2、KafkaTemplate配置生产者拦截器1.3、使用Java代码创建主题分区副本1.4、application.yml配置----v1版1.5、屏蔽 kafka debug 日志 logback.xml1.6、引入spring-kafka依赖1.7、控制台日志 1、生产者拦截器 1.1、创建生产者拦…