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

Posted

技术标签:

【中文标题】如何使用#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 :(

以上是关于如何使用#define 指令定义复杂类型?的主要内容,如果未能解决你的问题,请参考以下文章

复杂类型及编译相关

#define宏作用

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

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

如何使用 cppunit 断言宏来检查返回数据类型的预处理器值?

如何正确使用const(常量),define(宏)