gpt4 book ai didi

c - 如何避免将 void* 错误地转换为错误的类型?

转载 作者:太空狗 更新时间:2023-10-29 15:30:09 24 4
gpt4 key购买 nike

在 C 中编程,是否有任何技术可以用来避免(或至少最大限度地减少)错误地将 void * 强制转换为错误的指针类型?我正在开发一个程序,该程序解析几种不同类型的 CSV 数据文件并将字段存储到特定的数据结构中以供处理。例如,其中一个数据文件的记录存储在哈希表中;来自另一个文件的数据存储在有向图中。

我想创建一个主要的解析函数,它从文件中读取字段记录,并将每条记录传递给一个函数,该函数对字段进行标记并将它们存储在适当的数据类型中。我不想为每种文件类型创建单独的解析/标记化函数,而是想创建一个通用函数来执行此操作。在我的设计中,调用函数将传递字段记录、指向适用于数据文件的分词器的函数指针,以及指向适用于数据文件的目标数据结构节点的 void*。

我想知道的是有没有什么方法可以确保用户不会错误地调用带有不匹配的分词器/数据结构的解析函数。 (通过使用指向 void 的指针,编译器在这里肯定是无能为力的。)或者,如果没有这种技术,是否有任何有效的异常处理方法来捕获此错误并防止出现重大问题(例如,sigfaults)?

我希望代码尽可能具有可移植性。

有什么想法吗?我不喜欢这个算法,如果有人有更好的主意,我愿意接受。

最佳答案

一种可能性是创建一组非常薄的包装函数来抽象掉类型安全问题:

void foo_generic(FieldRecords *records, Parser *parser, void *dest);

...

void foo_A(FieldRecords *records, A *dest) { foo_generic(records, &parse_A, dest); }
void foo_B(FieldRecords *records, B *dest) { foo_generic(records, &parse_B, dest); }
void foo_C(FieldRecords *records, C *dest) { foo_generic(records, &parse_C, dest); }

现在,所有打字错误的可能性都被限制在一个位置,由于对称性,应该更容易发现错误。

如果你觉得特别调皮,你可以使用宏来简化这些包装函数的生成:

#define FOO(T) void foo_##T(FieldRecords *records, T *dest) { \
foo_generic(records, &parse_##T, dest); \
}

FOO(A)
FOO(B)
FOO(C)

这最大限度地减少了拼写错误的可能性,但增加了混淆调试器/IDE 的机会!

关于c - 如何避免将 void* 错误地转换为错误的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9551137/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com