0

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

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 类型

4

2 回答 2

2

可能的解决方案。

  1. 只需为它们都使用一个长度为 11 的数组。您真的用完了操作系统上的最后 6 个字节吗?
  2. 使它成为一个动态数组。
  3. 只用汇编写,你显然不关心 C 的更高层次。
  4. 使用像 C++ 这样支持模板或多态的语言。
  5. 只需传递struct您关心的参数即可。

    无效乐趣(int* whatnot){ *whatnot = 5; }

    int main() { fun(&myStruct.whatnot); 返回0;}

  6. 考虑到准 OO 设计。

    struct { int whatnot; } typedef 常见的;

    struct TH_CONFIG_1 { 通用通用;诠释事物[11];};

    struct TH_CONFIG_2 { 共同共同;诠释事物[5];}

但如果你坚持...

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 商店的代码审查。

于 2013-03-11T13:51:36.940 回答
1

您可以使用任何指针类型并将其强制转换。

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

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

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

由于super是 的开头struct extended,您可以毫无问题struct extended *地转换为。struct base *当然,您可以通过在开头重复相同的字段来做到这一点struct extended,但随后您就是在重复自己。

于 2013-03-11T13:55:41.953 回答