如何在C中重载函数?

PET*_*OOL 2 c generics

有很多关于这个主题的帖子,但它们都不是为 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在我的代码中使用函数,它将被正确的实现所取代。

从我对互联网的研究,特别是堆栈溢出,我了解到有两种选择可以做这样的事情:

  1. 使用带有_Generics& 的宏__ARGS_V__(没有 IDEA 如何实现)
  2. 使用带有下划线参数的宏,例如foo(_1,_2,_3...),但我真的不明白这些下划线是什么意思

请帮我解决这个问题;(

klu*_*utt 6

有很多关于这个主题的帖子,但它们都不是为 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)

如果这些确实是性能问题,您可以稍后删除它们。最有可能的是,他们不是。

但总的来说,我会建议您选择一种支持您需要的功能的语言,并且当您选择了一种语言时,请按预期使用它。不要试图在它不是设计的东西上硬塞。

滥用一门语言确实很有趣,它也可以帮助您获得很多见解。但是这些技术很少非常有用。然而,了解它们的工作原理通常对调试有很大帮助。