c11 _Generic 泛型关联的结果表达式的每个分支都必须有效吗?

2023-12-04

我似乎无法将参数传递给需要不同参数的函数(或传递给实现第一个类型的子集的其他 _Generic 宏)。

#define DEBUG_PRINT(x,...) _Generic((x),                    \
    debug_print_options *: DEBUG_PRINT_CUSTOM_TYPE(x,  __VA_ARGS__),    \
    default: DEBUG_PRINT_BASIC_TYPE(x, __VA_ARGS__))


#define DEBUG_PRINT_BASIC_TYPE(x,...) debug_print_printf_specifier((#x), (x), TYPE_TO_PRINTF_SPECIFIER(x), __FILE__, __LINE__, _my_func__, &((struct debug_print_options){__VA_ARGS__}))
#define DEBUG_PRINT_CUSTOM_TYPE(x,...) debug_print_custom_to_debug_string((#x), (x), GET_CREATE_DEBUG_STRING_FUNC(x), __FILE__, __LINE__, _my_func__, &((struct debug_print_options){__VA_ARGS__}))

给出编译错误:

debug_print.h:123:46: error: ‘_Generic’ selector of type ‘struct debug_print_options *’ is not compatible with any association

这使得它看起来像是在每个分支机构都得到了评估。如果我注释掉它会编译的默认值。

有办法解决这个问题吗?


您的编译器错误不是来自宏本身,而是来自对它们的某些调用。因此,如果您发布导致错误的调用,将会有所帮助。话虽如此,我将解决您关于 _Generic 表达式的一般问题。

该标准规定如下(6.5.1.1,“语义”下):

不评估通用选择的控制表达式。如果是通用选择 具有与类型名称兼容的通用关联 控制表达式,则泛型选择的结果表达式为 该通用关联中的表达。否则,通用的结果表达式 Selection 是默认通用关联中的表达式。没有任何表达方式 对来自任何其他通用关联的通用选择进行评估。

因此,在回答您的评论时,请添加您的问题,不,仅评估所选分支。

_泛型表达式是表达式,而不是宏。宏不需要具有正确的语法。它甚至不需要括号平衡。宏唯一需要做的就是在每次使用它时扩展为有效的代码。表达方式不同。它们需要匹配语言的语法。

在 _Generic 表达式的情况下,每个项目的语法可以是任何不包含未用括号(或条件运算符)屏蔽的逗号运算符的有效 C 表达式。如果您的 _Generic 满足此条件,并且所选语句不会导致问题,那么它将起作用。因此,只要语法有效,它就会起作用。

当您不知道变量的类型时,使用正确的语法可能会有点棘手。如果您遇到问题,可以在需要的地方在“x”上插入显式转换,将其转换为该分支上的类型。这样代码是有效的,并且强制转换是多余的并且将被优化掉。

至于您遇到的特定错误,听起来就像您没有与输入匹配的类型并且没有默认语句时会遇到的错误。同样,如果没有看到你的调用,就很难说。但我会确保您完全匹配类型,包括限定符。我要问的一个具体问题是 debug_print_options 是否是 typedef,就好像它仅定义为结构标记一样,那么您需要将“struct”放入 _Generic 中才能正确识别类型。

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

c11 _Generic 泛型关联的结果表达式的每个分支都必须有效吗? 的相关文章

随机推荐

  • 当用户关闭浏览器而不注销时如何终止会话

    我正在开发一个 aspnet 应用程序 因为我正在使用 Sessions 如果用户登录到应用程序并单击此处注销 我将关闭会话 假设如果用户没有单击注销并关闭浏览器 当用户关闭浏览器而不注销时如何终止会话 非常困难的任务 使用超时时间非常短的
  • Java awt.Robot 无法在虚拟机内工作?

    我正在尝试使用 java awt Robot 类在虚拟机内进行测试 如果我在主机中测试它 一切都会按预期工作 但是当我在虚拟机中运行相同的程序时 没有任何反应 也没有错误 异常 我尝试过在不同计算机上运行 Windows XP 或 Wind
  • 单击时将金额添加到背景位置(jQuery)

    我对 js 和 jquery 很陌生 所以请耐心等待 我想更改背景位置 并在单击 button1 时在 div1 上添加 1 在单击 button2 时在 div1 上添加 1 我怎样才能在 jQuery 中实现这一点 另外 奖金问题 这些
  • 如何使用 javascript 更改进度条的颜色?

    请查看我到目前为止的代码 jsfiddle 我试图在进度条达到最大容量后更改其颜色 我怎样才能做到这一点 HTML 代码
  • 数据帧 R 中值组合的计数

    我有一个像这样的数据框 df lt structure list id c A A A B B C C D D E E expertise c r python julia python r python julia python juli
  • Grails 插件 bean 的重写方法

    Spring Security 插件提供了一个名为 springSecurityService 类型的 beangrails plugins springsecurity SpringSecurityService 我需要覆盖getCurr
  • 在php中为长时间运行的进程创建后台进程

    好吧 如果这是另一个问题的重复 请原谅我 但经过搜索后我还没有找到明确的答案 我基本上想做的是让我的 php Web 应用程序触发一些事件 例如电子邮件发送器或报告生成器 这些事件可能需要几分钟才能完成并立即将控制权返回到页面 我来自 NE
  • 如何在 IIS7 Windows Server 2008 R2 上启用 TLS1.2

    我有一个在 IIS7 上提供服务的 Windows Server 2008 R2 我启用了 TLS 1 2 如下所示 但不幸的是 我的一位客户据说他们使用 TLS 1 2 时出现 SSL 连接错误 当我尝试使用 OpenSSL 检查时 TL
  • 从 fortran 而不是 C 调用 C++ 函数

    是否可以从 FORTRAN 调用 C 函数 例如 include
  • 线程实时记录

    我正在编写一个用于调整照片大小的简单脚本 我想要一个带有文本字段的小部件 其中在调整每个文件大小后会显示消息 usr bin python3 coding utf 8 import time sys from PyQt5 QtCore im
  • 如何在 Swift 中从自定义编码/解码的 json 中删除数据模型 nil 字段

    我正在尝试找到一种干净的方法来删除数据模型可选属性 如果它 nil当在 Swift 中自定义编码 解码我的数据模型时 我的用例 import Foundation public struct Message public let txnID
  • 如何从 PIG 中生成的包(其大小可能会有所不同)中提取第一个元组?

    我正在生成一个信息 包 其大小 包内元组的数量 可能会有所不同 由此 我想动态提取第一个元素 我该怎么做呢 使用DataFu UDF FirstTupleFromBag http datafu incubator apache org do
  • C++ 精度:字符串到双精度

    在对转换为双精度的字符串执行一些操作后 我遇到了双精度的精度问题 include
  • 访问 GridPane 节点时出现问题

    我希望你能帮助我做一个我想做的小项目 我正在尝试使用 JavaFX 的 GUI 创建视频游戏 但遇到了一些麻烦 这是我为练习而编写的代码 我不知道为什么这不起作用 public class Main extends Application
  • 预览期间找不到基于上传文件创建的 StreamedContent

    我在 jsf 页面上创建了一个文件上传对话框和一个图像库 每次上传图像后 图库应显示迄今为止上传的所有图像 图像将存储在后端 bean 中 并且应该由图库从后端 bean 动态获取 由于某种原因 图库显示上传的图像标签 但不显示引用图像 因
  • 选择每个类别的前 10 条记录

    我想在一个查询中返回每个部分的前 10 条记录 任何人都可以帮助如何做到这一点吗 部分是表中的列之一 数据库是 SQL Server 2005 我想返回按输入日期排列的前 10 名 部分分为业务部分 本地部分和特色部分 对于某个特定日期 我
  • codeigniter CSRF 错误:“不允许您请求的操作。”

    我在 codeigniter 的配置文件中启用了 csrf protection 选项 并使用 form open 函数来创建我的表单 但是当我提交表单时 出现以下错误 不允许您请求的操作 我已经完成了类似这个主题的答案 与我的问题最相关
  • Pandas 列中所有字数的总和

    我有一个包含字符串的 pandas 列 我想获得整列中所有单词的字数 在不循环每个值的情况下执行此操作的最佳方法是什么 df pd DataFrame a some words lots more words hi 当运行于df a 你应该
  • 使用 Java 创建具有相似名称的文件而不覆盖现有文件

    我想知道是否可以创建多个具有相似名称的文件 而不覆盖当前文件 例如 如果我有一个文件 xyz txt 下次我创建它时应该是 xyz 1 txt try File makefile new File output txt FileWriter
  • c11 _Generic 泛型关联的结果表达式的每个分支都必须有效吗?

    我似乎无法将参数传递给需要不同参数的函数 或传递给实现第一个类型的子集的其他 Generic 宏 define DEBUG PRINT x Generic x debug print options DEBUG PRINT CUSTOM T