C泛型类型作为函数参数输入

时间:2013-03-11 13:47:04

标签: c function types struct arguments

所以我有两个不同的结构,其中我将访问的所有属性都是相同的。我也有一个功能,谁的论点,我希望能够接受两者中的任何一个。例如:

typedef struct{
    int whatnot = 14;
    int thing[11];
} TH_CONFIG;

typedef struct{
    int whatnot = 3;
    int thing[5];
} TH_CONFIG_2;

*_CONFIG var;

void fun(*_CONFIG input)
{
    input.whatnot = 5;
}

int main(){
    fun(var);
}

我可能有一个暗示,我应该使用void作为我可以类型转换的类型?但是我的搜索只产生了关于函数指针,模板和C#的东西。

编辑:* _CONFIG并不意味着语法正确,它表示我不知道该怎么做,但它应该是_CONFIG类型

2 个答案:

答案 0 :(得分:2)

可能的解决方案。

  1. 只需使用长度为11的数组。你真的用完了操作系统的最后6个字节吗?
  2. 将其设为动态阵列。
  3. 只是在汇编中写,你显然不关心C的更高级别。
  4. 使用支持模板或多态的C ++语言。
  5. 只需传递您关心的struct的参数。

    void fun(int * whatnot){     * whatnot = 5; }

    int main(){     有趣(放; myStruct.whatnot);     返回0; }

  6. 考虑准OO设计。

    struct {     int whatnot; } typedef Common;

    struct TH_CONFIG_1 {     常见的;     int thing [11]; };

    struct TH_CONFIG_2 {     常见的;     int thing [5]; }

  7. 但如果你坚持......

    void fun(void* input) {
        ( (int)(*input) ) = 5;
    }
    

    ...或

    void fun(void* input) {
        ( (TH_CONFIG*) input)->whatnot = 5; // may have been a TH_CONFIG_2, but who cares?
    }
    

    注意:这不会在任何C商店通过代码审查。

答案 1 :(得分:1)

您可以使用任何指针类型并进行投射。

如果您访问的所有属性都相同,我猜测一个属性是另一个属性的扩展(因为属性需要从结构的开头具有相同的偏移量)。在这种情况下,您可能想要使用此模式:

struct base {
  int foo;
  char **strings;
};

struct extended {
  struct base super;
  double other_stuff;
};

由于super位于struct extended的开头,您可以毫无问题地将struct extended *投射到struct base *。当然,你可以通过在struct extended的开头重复相同的字段来做到这一点,但是你会重复自己。