在 C 中将匿名结构作为参数传递

2024-03-09

我有以下 c 行(为了可读性而添加回车符 - 它们不在代码中):

#define i2c_write(slave_addr, reg_addr, len, *data_ptr)
    twi_master_write(MPU_TWI, {
        .addr = reg_addr,
        .addr_length = 1,
        .buffer = *data_ptr,
        .length = len,
        .chip = slave_addr
    })

Where twi_master_write()声明为:

uint32_t twi_master_write(Twi *p_twi, twi_packet_t *p_packet);

and twi_packet_t声明为:

typedef struct twi_packet {
    uint8_t addr[3];
    uint32_t addr_length;
    void *buffer;
    uint32_t length;
    uint8_t chip;
} twi_packet_t;

参数为twi_write()都必须是类型unsigned char.

编译时,我收到以下错误:

expected expression before '{' token

有没有正确的方法来做我在这里想做的事情,或者这是不可能的?


我的看法,在一个可编译的示例中。这是一个编译存根将无法正确运行,所以不要尝试按原样运行它!

//
// Cobbling up a compilation stub
//

#include <stdint.h>

struct Twi;
typedef struct Twi Twi;

#define MPU_TWI (Twi*)0

typedef struct twi_packet {
    uint8_t addr[3];
    uint32_t addr_length;
    void *buffer;
    uint32_t length;
    uint8_t chip;
} twi_packet_t;

uint32_t twi_master_write(Twi *p_twi, twi_packet_t *p_packet);


//
// Now for my answer :
//

#define i2c_write(slave_addr, reg_addr, len, data_ptr) \
    twi_master_write(MPU_TWI, &(twi_packet_t){         \
        .addr = reg_addr,                              \
        .addr_length = 1,                              \
        .buffer = *data_ptr,                           \
        .length = len,                                 \
        .chip = slave_addr                             \
    })

main()
{
    // Trigger that macro !
    i2c_write(0, 0, 0, (void**)0);
}

这实例化了一个复合文字并将其地址传递给函数。文字的生命周期不超过完整调用表达式的生命周期。

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

在 C 中将匿名结构作为参数传递 的相关文章

随机推荐

  • 如何从 Chrome 中的网页抓取数据并输出到 Chrome 扩展弹出窗口中?

    对于 Google Chrome 扩展程序 我编写的用于操作扩展程序 popup html 的 DOM 的 Javascript 似乎都不会对弹出窗口的 DOM 产生任何影响 我可以使用 content script js 很好地操作浏览器
  • Prism BindableBase.SetProperty()

    我正在开发一个基于 BindableBase 的 ViewModel 该虚拟机拥有域模型的一个实例 VM公开了一个属性 比如Name 我不想使用本地存储 即VM中的存储 而是委托给模型对象的属性 我想使用 SetProperty 但存储引用
  • Android Volley 库不返回完整的响应数据

    Volley 库不返回完整的响应数据 它只返回响应数据的一部分 我正在调用 drupal 服务 下面是我的代码 public void BoardRoomRequest pdialog new ProgressDialog BoardRoo
  • jqGrid 显示用于行内编辑的“编辑”图标

    我正在使用带有内联编辑选项的 jqGrid 如果单元格没有任何值 我想显示一个编辑图标 所以我写了一个格式化程序 function aFormatter cellvalue options row if cellvalue null ret
  • 使用 JavaScript 将 div 定位在圆圈中

    我正在尝试定位15div元素均匀地分布在半径为150px 我正在使用以下代码 它似乎给出了一个重叠的奇怪的偏心椭圆 Fiddle http jsfiddle net 4qt5uaz1 3 Hold a global reference to
  • 如何从 jQuery 对象中删除元素?

    Code div d1 div div d2 div 我用过j add 添加元素到j 但是我该如何删除 d1 from j j remove 不起作用 因为它删除了 d1 and j length仍然是2 谢谢大家 div d1 div
  • 从IP地址获取地理位置[重复]

    这个问题在这里已经有答案了 可能的重复 在 Java 中获取地理位置的最佳方法 https stackoverflow com questions 1415851 best way to get geo location in java j
  • 避免 .NET Native 错误

    我去年 兼职 将现有 且成功的 Windows 8 1 应用程序迁移到 Windows 10 UWP 现在 就在将其发布到商店之前 我在 发布 构建模式 触发 NET Native 下测试了该应用程序 一切似乎都有效 直到我 偶然 注意到一
  • 嵌套 Python 模块导入的最佳实践

    假设我有一个 Python 模块 main py import math from the standard Python library import my own module foo math cos bar 我还需要在 my own
  • 如何使用 Linux 命令获取可用内存的百分比? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用 Linux 命令行获取以百分比形式报告的可用内存 我用的是free命令 但这只是给我数字 并且没有百分比选项 使用free命令 free t
  • ssl.get_server_certificate 适用于具有 SNI(服务器名称指示)的站点

    我正在尝试获取 badssl com 子域的服务器证书 例如https expired badssl com https expired badssl com import ssl ssl get server certificate ex
  • 如何在SML中使用IntInf或LargeInt?

    我想通过此链接中的 pow 等函数在 SML 中执行大整数计算 http www standardml org Basis int inf html IntInf STR SPEC http www standardml org Basis
  • 检测图像中线条的起点和终点(numpy 数组)

    我有一个像下面这样的图像 我想要的是获取每个线段的起点和终点的坐标 实际上我的想法是考虑这样一个事实 每个极值点应该只有一个属于其邻域中的线段的点 而所有其他点应该至少有 2 个 不幸的是 该线的厚度不等于一个像素 因此这一推理不成立 这是
  • 如何使用实体关系不直接的休眠标准连接多个表?

    我有三个实体 那些是 Entity public class Organization Id private long id Column private String name Entity public class Book Id pr
  • 活跃用户 SQL 查询

    我正在尝试绘制网络应用程序中的活跃用户图表 我的数据库由两个主表组成 user and task task has a user id 我的定义活跃用户 is 在给定结束日期后两周内创建了 2 个以上任务的用户 因此 我需要一个 SQL 查
  • 在ocaml中编写多行函数

    我无法理解如何在 ocaml 中编写函数 因为我只编写了不需要用 分隔的多行的递归函数 我正在尝试创建一个函数 给定一个整数 n 返回一个充满零且对角线上只有一个的矩阵 因此大小为 n 的单位矩阵 我是函数式编程和 ocaml 的新手 所以
  • Flutter - 在 Android 上访问隐藏方法 Lsun/misc/Unsafe 错误

    我收到 Flutter 项目的错误 我将开始一一停用插件 并希望找出其中之一是否导致了问题 在那之前 我会将其留在这里 以防有人提出建议 Accessing hidden method Lsun misc Unsafe gt putObje
  • PowerShell:带有 ConvertTo-XML 输出的自定义属性 XML 标签

    我正在 PowerShell 中创建一个新对象 使用哈希表来设置属性值 然后我想使用 ConvertTo XML 方法将对象导出为 XML 格式 hash Processor Intel Disk 500GB Server ABC Seri
  • 如何使用 opencv python 将黑色更改为红色

    你怎么能用Python做到这一点 我在这条线上遇到了问题 img rgb Set mask cv2 Scalar 0 0 255 这是代码 import numpy as np import imutils import cv2 img r
  • 在 C 中将匿名结构作为参数传递

    我有以下 c 行 为了可读性而添加回车符 它们不在代码中 define i2c write slave addr reg addr len data ptr twi master write MPU TWI addr reg addr ad