有很多关于这个主题的帖子,但它们都不是为 C 编程的完整初学者准备的。
问题是我有三个功能:
struct model* createModel_empty(void);
struct model* createModel_single_value(double value);
struct model* createModel_single_value(const double* arr_value);
Run Code Online (Sandbox Code Playgroud)
我只想createModel在我的代码中使用函数,它将被正确的实现所取代。
从我对互联网的研究,特别是堆栈溢出,我了解到有两种选择可以做这样的事情:
_Generics& 的宏__ARGS_V__(没有 IDEA 如何实现)foo(_1,_2,_3...),但我真的不明白这些下划线是什么意思请帮我解决这个问题;(
有很多关于这个主题的帖子,但它们都不是为 C 编程的完整初学者准备的
仅仅是因为这些技术不适合初学者。出于同样的原因,您不会找到针对不能玩三个球的人的用 7 个球进行杂耍的教程。
但是有一个相当简单——虽然笨重——的解决方法。将数据包装在结构中。
struct data {
union {
const double *p;
double d;
} data;
int type;
};
struct model* createModel_single_value(struct data data) {
switch(data.type) {
case 0: return createModel_single_value_double(data.data.d);
case 1: return createModel_single_value_const_double_ptr(data.data.p);
default: return NULL;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这是一个运行时解决方案,而不是您可以使用您提到的方法实现的编译时间。如果您不小心,这可能会使它容易出现“有趣的行为”,因此我建议采取以下预防措施:
使用enumfor 类型,唯一的原因是它更具可读性:
enum type { DOUBLE, CONSTDOUBLEPTR };
struct data {
enum type type;
...
Run Code Online (Sandbox Code Playgroud)
并在工作函数中添加断言:
struct model* createModel_single_value_double(struct data data) {
assert(data.type == DOUBLE);
Run Code Online (Sandbox Code Playgroud)
如果这些确实是性能问题,您可以稍后删除它们。最有可能的是,他们不是。
但总的来说,我会建议您选择一种支持您需要的功能的语言,并且当您选择了一种语言时,请按预期使用它。不要试图在它不是设计的东西上硬塞。
滥用一门语言确实很有趣,它也可以帮助您获得很多见解。但是这些技术很少非常有用。然而,了解它们的工作原理通常对调试有很大帮助。
| 归档时间: |
|
| 查看次数: |
104 次 |
| 最近记录: |