如何避免错误地将空格*转换为错误的类型?

THV*_*THV 4 c pointers void

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

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

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

我希望代码尽可能便携.

有什么想法吗?我没有嫁给这个算法,如果有人有更好的想法我会对它开放.

Oli*_*rth 5

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

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); }
Run Code Online (Sandbox Code Playgroud)

现在,拼写错误的所有潜力都被限制在一个位置,由于对称性,错误应该更容易找到.

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

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

FOO(A)
FOO(B)
FOO(C)
Run Code Online (Sandbox Code Playgroud)

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