替换嵌套 for 循环的宏

2024-01-10

我找到了这个宏#define TIMES(x) for(int i1=0;i1<x;i1++)缩短代码文本非常实用。但当我有嵌套循环时,我不知道如何编写这样的宏,甚至我不知道它是否可能。这个想法如下。这段代码可以写吗

for(int i1=0;i1<5;i1++)
    for(int i2=0;i2<3;i2++)
        for (int i3=0;i3<7;i3++)
        /* many nested `for` loops */
{
    /* some code, for example to print an array printf("%d \n",a[i1][i2][i3]) */
}

as

TIMES(5) TIMES(3) TIMES(7) ....
{
    /* some code, for example to print an array printf("%d \n",a[i1][i2][i3]) */
}

使用一种“递归”宏来检测所有TIMES并将它们替换为for循环 i1、i2、i3、... i'n' 循环计数器?


这是非常不好的做法,不要这样做。其他 C 程序员完全了解 for 循环,但他们完全不知道您的私有、秘密宏语言。此外,像这样的类函数宏的类型安全性很差,只能作为最后的手段使用。

正确的解决方案是不使用宏,而是使用函数。如果您希望使用正确的泛型编程,可以按如下方式编写:

typedef void callback_t (int data);

void traverse (size_t n, int data[n], callback_t* callback)
{
  for(size_t i=0; i<n; i++)
  {
    callback(data[i]);
  }
}

Where callback是调用者提供的函数指针,其中包含实际的功能。类似于宏中的循环体。

完整示例:

#include <stdio.h>

typedef void callback_t (int data);

void traverse (size_t n, int data[n], callback_t* callback)
{
  for(size_t i=0; i<n; i++)
  {
    callback(data[i]);
  }
}


void print (int i)
{
  printf("%d ", i);
}

int main (void)
{
  int array [5] = {1, 2, 3, 4, 5};

  traverse(5, array, print);
}

EDIT:

在上面的例子中,数据类型是int。但由于它是通用编程,您可以进行一些调整并将其交换为任何其他数据类型,例如数组或结构。需要注意的是,您必须通过指针将参数传递给回调,而不是按值传递。例子:

#include <stdio.h>

/* Generally it is bad practice to hide arrays behind typedefs like this. 
   Here it just done for illustration of generic programming in C. */
typedef int data_t[3]; 

typedef void callback_t (data_t* data);

void traverse (size_t n, data_t data[n], callback_t* callback)
{
  for(size_t i=0; i<n; i++)
  {
    callback(&data[i]);
  }
}


void print_array (int(*array)[3])
{
  int* ptr = *array;
  printf("{%d %d %d}\n", ptr[0], ptr[1], ptr[2]);
}

int main (void)
{
  int array [2][3] = { {1, 2, 3}, {4, 5, 6} };

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

替换嵌套 for 循环的宏 的相关文章

  • C++ 维护子类对象的混合集合

    如果我在这里错过了一个相当基本的概念 我很抱歉 但我正在尝试弄清楚如何维护多个类类型的集合 所有类类型都派生自同一个父类 并且在检索它们时仍然可以访问它们的特定于子类的方法从集合中 作为上下文 我有一个基类 BaseClass 和许多类 例
  • 如何从 C# 中的 dataTable.Select( ) 查询中删除单引号?

    所以我有一个经销商名称列表 我正在我的数据表中搜索它们 问题是 一些傻瓜必须被命名为 Young s 这会导致错误 drs dtDealers Select DealerName dealerName 所以我尝试替换字符串 尽管它对我不起作
  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 使用 GCP 的数据存储区时如何区分代码是在模拟器中运行还是在 GKE 中运行

    按照中给出的说明进行操作后 我不确定是否遗漏了任何内容https cloud google com datastore docs tools datastore emulator https cloud google com datasto
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp

随机推荐

  • 除了 Haxe 之外,还有其他针对 PHP 的编程语言吗?

    PHP 并没有得到太多的喜爱 但在易于部署 对于廉价托管 方面仍然是赢家 有没有任何编程语言 除了Haxe http haxe org 那个目标 PHP 用这种语言编写应用程序 然后将其翻译成 PHP 就像某些语言以 C 作为中间语言一样
  • 如何使用 NHibernate 插入或更新(或覆盖)记录?

    我需要将一行写入数据库 无论它是否已经存在 在使用 NHibernate 之前 这是通过存储过程完成的 该过程将尝试更新 如果没有行被修改 它将回退到插入 这很有效 因为应用程序并不关心记录是否存在 对于 NHibernate 我发现的解决
  • 如何访问 Galaxy S5 心率传感器?

    In the 三星的编程指南 http img developer samsung com contents cmm SHealth SDK Package ProgrammingGuide 2 Bio Physiology eng v1
  • 如何使用数组包含元素创建 NSPredicate

    我只是有Address有财产的实体favourites类型的 String Address objc Address class Address NSManagedObject Observer NSManaged var favourit
  • 在反应中一次导入多个图像文件的任何简单方法

    我输入以下内容来导入图像 需要一个简短的方法来做到这一点 import banner1 from imgs Banners banner1 jpg import banner2 from imgs Banners banner2 jpg i
  • 通过提升业力重用已解析的变量

    我有一个与下面的代码相当的代码库 我尝试生成一个文本文件 其内容是变量的两倍 我觉得答案在于语义动作以及 a 和 val 但即使有文档也无法完成 您将如何做才能拥有 str 中的 toto 和输出 托托一些东西托托 即如何在业力中重用已解析
  • 检测设备是否正在充电

    我找不到任何明确的用途我最喜欢的工具 http www google com 不过我想我会把它放在这里 有没有办法使用 iPhone SDK 让应用程序检测设备是否处于通电状态 充电 底座等 如果设备正在通电 否则它是用户指定的设置 我希望
  • Rails 迁移变更列

    We have script generate migration add fieldname to tablename fieldname datatype用于向模型添加新列的语法 在同一行上 我们是否有一个脚本 生成来更改列的数据类型
  • timessince 过滤器的格式

    有没有办法使用 date timesince 过滤器 但不是有两个相邻的单元 而是只显示一个 例如 我的模板当前显示 18 小时 16 分钟 我怎样才能让它显示 18小时 这里不考虑四舍五入 谢谢 我想不出一个简单的内置方法来做到这一点 这
  • JavaScript 如何创建稀疏数组?

    虽然我不知道这个功能的名称 a a 57 test console log a length console log a 57 console log a 我很敬畏这是可能的 由于具有 C 背景 这种行为与分配内存之类的行为非常不同 那么几
  • Elasticsearch-Kibana docker-compose - 禁止使用“elastic”值

    我想使用 docker compose 运行 elasticsearch 和 kibana 这是我的 docker compose yml 我使用 docker compose env file dev env up 运行 Docker 组
  • 如何运行 NDK 示例?

    很抱歉问这样一个菜鸟问题 但是 NDK 文档是错误的 r7b 如果您使用 ADT 在 Eclipse 中进行开发 请使用新建项目向导 使用 导入 为每个示例创建一个新的 Android 项目 从现有源 选项并从以下位置导入源
  • 如何在 CMake 中检查列表是否包含特定条目?

    我想检查列表是否包含特定条目 如以下代码片段所示 macro foo if ARGN contains bar endif endmacro CMake 不提供contains 获得所需结果的最佳 最简单方法是什么 在CMake的wiki
  • 如何在 UWP 应用中隐藏/折叠标题栏?

    有没有办法以某种方式隐藏 折叠 使 UWP 应用程序中的标题栏暂时不可见 但不能完全禁用 我知道可以使应用程序全屏显示 然后标题栏自动折叠 但我需要在可调整大小的桌面窗口中实现它 我还知道您可以自定义标题栏的外观 例如颜色等 原因 我的应用
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • 结构化流Kafka 2.1->Zeppelin 0.8->Spark 2.4:spark不使用jar

    我有一个 Kafka 2 1 消息代理 想要对 Spark 2 4 中的消息数据进行一些处理 我想使用 Zeppelin 0 8 1 笔记本进行快速原型设计 我下载了结构化流所需的spark streaming kafka 0 10 2 1
  • 使 Eclipse equals() / hashCode() 使用 getters

    是否可以使默认的 Eclipse 生成 hashCode 和 equals 使用 getters 而不是字段引用 IE 我可以获取它使用的模板吗 我正在使用 Hibernate 代理对象仅在使用 getter 时才 LazyLoaded 而
  • 如何在 PyQt 中获取按钮或标签(QPushButton、QLabel)的背景颜色

    我对 PyQt 还很陌生 有谁告诉我如何在 PyQt 中获取按钮或标签 QPushButton QLabel 的背景颜色 这是示例代码 这会对你有所帮助 QPushButton button1 button2 button1 setStyl
  • session_regenerate_id() - 已在单元测试 Yii 控制器中发送的标头

    我正在尝试对我的控制器 Yii 框架 进行单元测试 dataProvider provider public function testActionEdit view login controller user new CWebUser u
  • 替换嵌套 for 循环的宏

    我找到了这个宏 define TIMES x for int i1 0 i1