如何使用#define 指令定义复杂类型?

     2023-02-17     125

关键词:

【中文标题】如何使用#define 指令定义复杂类型?【英文标题】:How to define a complex type with the #define directive? 【发布时间】:2020-10-22 20:09:20 【问题描述】:

我正在学习构建复杂类型。这里我使用typedef定义了一个指向short数组5的指针:

typedef short (*mytype)[5];

我正在尝试找出如何与#define 指令相同,以及它是否可行。我试过这个,但它不起作用:

#define MYTYPE (short*)[5]

似乎该指令不能用于定义比指针或结构更复杂的东西。那么,这里有什么意义呢?

【问题讨论】:

建议:不要隐藏 * 作为 typedef。源代码中的* 是一个很好的视觉说明,说明某事物是指针;同样,* 的缺失是一个很好的指标,它 不是 指针。在 typedef 中隐藏 * 会破坏这种视觉指示。 @pmg 我只是为了教育目的,这没有任何实际用途。仍然感谢您的建议,我会记住这一点 类型为short (*)[5],但这仅适用于某些上下文,例如castssizeof 操作数,不适用于声明。 #define 指令并非专门用于为类型创建别名。适当的用途包括非常短的“功能”,提供一些替代品,这些替代品可用于根据各种环境定制软件,或发出信号来打开/关闭功能。 @EricPostpischil 不起作用,当指定 MYTYPE var; 时,它要求提供标识符或 ( @Kaiyaha:正如我的评论所说,这不利于声明。正如我的评论所说,#define 指令不适用于为类型创建别名。 【参考方案1】:

如何用#define 指令定义一个[指向数组类型指针的变量]?

你可以只使用一个函数宏。

#define MYTYPE(name)  short (*name)[5]
int main() 
    short arr[5];
    MYTYPE(a) = &arr;
    typedef MYTYPE(mytype);

这里有什么意义?

没有意义 - 预处理器是一个字符串替换工具,通常不了解 C 语法。使用 typedef 为类型定义别名。

【讨论】:

嗯,这是最明显的解决方案,但我只是想让MYTYPE 看起来完全像一个常规类型。这可能吗? plak plak plak :(

复杂类型及编译相关

...定义类型,并不是替换。    3)命名上,#define一般使用大写字符去代表,typedef一般使用小写字符_t去结尾。    4)typedef能够定义复杂类型,宏定义则不行。2.结构体:将多种数据类型合并成为一种复合类型,以后用这... 查看详情

c语言typedef和define的使用和区别

 #define是C的指令,用于为各种数据类型定义别名,与typedef类似,但是有一下几点不同 1,typedef仅限于为类型定义符号名称,而#define不仅可以为类型定义符号名称,也能为数值定义别名,比如可以定义1为TRUE;2,typedef是由编... 查看详情

#define S64_MIN 在 linux 数据类型中是如何定义的?

】#defineS64_MIN在linux数据类型中是如何定义的?【英文标题】:Howis#defineS64_MINdefinedinlinuxdatatypes?【发布时间】:2020-08-0115:07:50【问题描述】:我正在尝试理解以下else条件中使用的linux宏S64_MIN的定义,即draw=S64_MIN。S64_MIN的确切十... 查看详情

如何正确使用const(常量),define(宏)(代码片段)

前言在开发中,也许我们会经常使用到宏定义,或者用const修饰一些数据类型,经常有开发者不知道怎么正确使用,导致项目中乱用宏定义与const修饰符。本篇主要介绍在开发中怎么正确使用const与define(宏定义)当我们想定义全局... 查看详情

typedef关键字

...现在同一个表达式中。 2.typedef关键字和#define宏定义指令的区别#define属于预编译指令,在预编译阶段会进行单纯的文本替换,并不会进行类型检查。如有宏定义#defineAB,则在预编 查看详情

如何定义包含复杂对象的 GraphQL 类型模型?

】如何定义包含复杂对象的GraphQL类型模型?【英文标题】:HowtodefineaGraphQLtypemodelthatcontainscomplexobjects?【发布时间】:2018-06-2223:30:31【问题描述】:我正在使用FacebookGraphAPI的数据来获取用户信息并在GraphQL服务(graphcool)中创建我的... 查看详情

c语言中typedef和define的区别

typedefvs#define#define 是C指令,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定... 查看详情

如何使用 System.Net.HttpClient 发布复杂类型?

】如何使用System.Net.HttpClient发布复杂类型?【英文标题】:HowtouseSystem.Net.HttpClienttopostacomplextype?【发布时间】:2012-05-0512:00:09【问题描述】:我有一个想要使用WebAPI处理的自定义复杂类型。publicclassWidgetpublicintIDget;set;publicstringNam... 查看详情

define与typedef的区别

...指针声明:typedefbool(*funcPoiinter)(int,double);  给已有类型定义一个别名(类似的引用是给已有对象或者变量一个别名)  在编译阶段有效,具有类型检查的功能  定义域平台无关的数据类型。比如:size_t 查看详情

thinkphp的自定义返回类型具体是如何使用的?

关于thinkphp中的自定义返回类型怎么用,那位大虾给讲解一下最好给个例子!小弟不胜感激!参考技术A1.PHP基础,函数的使用,自定义函数,变量的作用域,“&”的作用等等,都是基础的东西。2.OOP,传说中的面向对象,这个... 查看详情

const常量与define常量的区别

c++中的常量可以使用const定义,也可以使用#define宏定义的方式;二者区别如下:-**区别**1.const定义的常量有自己的数据类型,编译器可以对其进行严格的类型检查;但是define定义的宏常量没有数据类型,执行时只会对其进行字符... 查看详情

gflag的简单入门demo(代码片段)

gflags一.下载与安装这里直接使用包管理器安装:sudoaptinstalllibgflags-dev二.gflags的简单使用1.定义需要的类型格式:DEFINE_类型名(变量名,默认值,描述语)类型定义格式bool类型DEFINE_bool32位的int类型DEFINE_int3264位的int类型DEFINE_int6464位的unsi... 查看详情

如何定义和添加枚举作为类型

】如何定义和添加枚举作为类型【英文标题】:Howtodefineandaddaenumastype【发布时间】:2011-04-2709:02:45【问题描述】:我正在使用ADO.NETEntityFramework处理customdataprovider。在CreateMetaData函数中,我需要在ResourceType中添加原始和复杂属性... 查看详情

如何在 HSQLDB 中创建复杂的用户定义类型?

】如何在HSQLDB中创建复杂的用户定义类型?【英文标题】:Howtocreateacomplexuser-definedtypeinHSQLDB?【发布时间】:2016-03-0511:03:03【问题描述】:如何在HSQLDB中创建复杂的用户自定义类型?Oracle语法:CREATETYPEtype_nameASOBJECT(oneVARCHAR2(255),t... 查看详情

如何在#define 中评估逗号

】如何在#define中评估逗号【英文标题】:Howtoevaluatecommaina#define【发布时间】:2016-06-1220:16:18【问题描述】:我正在使用XC8编译器开发一个带有PIC的小型嵌入式应用程序。在XC8中设置引脚的使用(输出或输入),程序员应该执行... 查看详情

#define定义与typedef(代码片段)

...从该宏定义开始的地方起到文件结束或遇到对应的"#undef"指令为止如果代码中有跟宏定义相关错误,则会在预处理阶段报错typedef=type+def"typedef"操作基于现有数据类型定义一个新的数据类型,原有数据类型依然存在,其会在编译阶... 查看详情

宏定义#define和常量const的区别

...与编译时期;const常量是一个"运行时"概念,在程序运行使用,类似于一个只读行数据存储 查看详情

理解复杂的类型脚本类型声明

...【发布时间】:2019-04-1813:36:15【问题描述】:问题是关于如何使用对象类型发送标头,而不是HTTPClient声明中提供的HttpHeaders。在使用AngularHttpClient时,我想用Object传递标头,我不明白如何定义[header:string]:string|类型的对象s 查看详情