C 中宏参数的类型检查

2023-11-25

是否可以对 #define 宏的参数进行类型检查?例如:

typedef enum
{
    REG16_A,
    REG16_B,
    REG16_C
}REG16;

#define read_16(reg16)  read_register_16u(reg16); \
                        assert(typeof(reg16)==typeof(REG16));

上面的代码似乎不起作用。我究竟做错了什么?

顺便说一句,我正在使用 gcc,并且我可以保证在这个项目中我将始终使用 gcc。该代码不需要是可移植的。


gcc 支持 typeof

例如取自 Linux 内核的类型安全 min 宏

#define min(x,y) ({ \
    typeof(x) _x = (x); \
    typeof(y) _y = (y); \
    (void) (&_x == &_y);        \
    _x < _y ? _x : _y; })

但它不允许您比较两种类型。请注意,指针比较会生成警告 - 您可以像这样进行类型检查(也来自 Linux 内核)

#define typecheck(type,x) \
({  type __dummy; \
    typeof(x) __dummy2; \
    (void)(&__dummy == &__dummy2); \
    1; \
})

想必您可以做类似的事情 - 即比较指针与参数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 中宏参数的类型检查 的相关文章

  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • 如何阻止网站在 iframe 中加载?

    最近我尝试在 iframe 中加载 youtube 网站 但我检查它不起作用 我使用了这个简单的代码 我想知道为什么我的网页无法加载 youtube 网站 内嵌框架 我使用什么代码在我的网页中加载 youtube 网站 我如何在我的网站中使
  • 如何将 WithEvents 关键字与全局变量一起使用?

    我试图在 VB6 模块中声明一个变量 如下所示 Public WithEvents MyObject As MyClass 帮助文件说WithEvents只能在类模块中使用 为什么不能用在 bas模块 我正在工作的遗留代码有一个在模块中全局
  • 在asp.net core中,空字符串是否会转换为NULL?

    假设我有一个form 以及值 当选择form从视图发送到controller to the action method will asp net core将空字符串转换为NULL value 如果我不将布尔属性设置为可为空 required
  • Java 机械化

    我想知道 Java 是否有类似 Perl Python 的机制 Thanks 看一眼HtmlUnit 和Perl的很相似WWW 机械化 它还有一个 Perl 版本 名为WWW HtmlUnit 它用内联 Java将 Java 库方法公开给
  • 比较包含 NaN 的 numpy 数组

    对于我的单元测试 我想检查两个数组是否相同 简化示例 a np array 1 2 np NaN b np array 1 2 np NaN if np all a b print arrays are equal 这不起作用 因为nan
  • 在请求规范中存根身份验证

    在编写请求规范时 如何设置会话和 或存根控制器方法 我正在尝试在集成测试中消除身份验证 rspec requests 这是一个测试示例 require File dirname FILE spec helper require File d
  • XPath :选择所有后续兄弟姐妹,直到另一个兄弟姐妹

    这是我的 xml 的摘录
  • 内部类是轻量级的吗?

    是内部类比普通类更轻量级 还是说最终java编译内部类就像普通类一样 我知道java中的类本身并不都是非常轻量级的 并且它们占用了permgen内存的一部分 所以我想知道是否最好使用类似闭包的函数作为内部类 或者标准类是否也可以 内部类和匿
  • Xampp:网络浏览器不会显示本地主机页面

    我已经在 Windows7 64 位 上安装了 xampp 我想使用 PHP Apache 和 MySql Xampp控制面板上Apache服务器和MySql服务运行正常 但是当我在网络浏览器上运行本地主机时 它只显示连接 没有其他的 与以
  • 使用 Altair 制作仪表板

    我想使用优秀的 Altair 库来创建仪表板 有没有办法创建仪表板而不显示任何代码 我在这里看到一些非常好的例子 https altair viz github io case studies exploring weather html但
  • 如何在android中的两个或多个应用程序之间安全地共享数据?

    我正在为企业环境制作一个应用程序框架 其中涉及两个或多个应用程序之间共享设备内存中的数据 该数据需要存储在设备上并且仅少数应用程序可以访问 可以通过用于安装它们的证书来识别 另外 它需要存储在secure方式 以便其他第三方应用程序无法访问
  • 命名空间与类声明

    我是 C 新手 我似乎找不到任何相关信息 所以我会在这里询问 命名空间中的类是否必须声明 using System public class myprogram void main The console class does not ha
  • 如何在 Unix 中的文件每行末尾添加 100 个空格

    我有一个文件 每行应包含 200 个字符 我收到一个每行只有 100 个字符的源文件 我现在需要为每行添加 100 个额外的空格 如果空格很少 我们可以使用 sed 如下所示 sed s filename gt newfilename 既然
  • java.lang.NullPointerException(无错误消息)

    我知道我的这个问题已经被问过很多次了 我确实遵循了大部分答案 但这些答案都没有帮助我 所以这是我的问题 每当我同步我的项目时它总是失败 Gradle 控制台如下所示 执行任务 app generateDebugSources app gen
  • Python列表的滑动窗口[重复]

    这个问题在这里已经有答案了 有没有一种有效或优雅的方法来检索Python中列表的所有k大小子列表 例如 arr 2 3 5 7 11 13 我想要所有 3 元素子列表 result 2 3 5 3 5 7 5 7 11 7 11 13 我知
  • 每次循环访问 Handlebars.js 范围之外的变量

    我有一个handlebars js 模板 就像这样 externalValue
  • 为什么在 Gmail API 中搜索返回的结果与在 Gmail 网站中搜索的结果不同?

    我正在使用 gmail API 搜索用户的电子邮件 我创建了以下搜索查询 ticket after 2015 11 04 AND from me AND in trash 当我在 Gmail 的浏览器界面中运行此查询时 我收到 11 条消息
  • 无法让factory_girl在rails 3.0.5下运行,意外的tCONSTANT

    这是我的 Gemfile 配置 group development test do gem rspec rails gem factory girl gt 2 0 0 beta1 gem factory girl rails git gt
  • 在字符串末尾使用 JavaScript 的 parseInt

    我知道 parseInt myString 10 Never forget the radix 如果字符串中的第一个字符是数字 将返回一个数字 但是如果我有一个像 column5 这样的字符串并且想要将其增加到下一个 column6 我该如
  • C 中宏参数的类型检查

    是否可以对 define 宏的参数进行类型检查 例如 typedef enum REG16 A REG16 B REG16 C REG16 define read 16 reg16 read register 16u reg16 asser