是否可以在执行期间永久更改指针类型? (C编程)

时间:2014-01-10 16:11:50

标签: c linux pointers casting

我有类似的东西

void my_very_large_function(void){
   struct A *sA;
   < a lot of references to *sA structure in many many lines >
}

现在我想根据传递给函数的参数使用另一种类型的结构,但我不想在每个引用中检查该参数。

void my_very_large_function(int type){
   struct A *sA;
   struct B *sB;
   if(type == 0)  // I dont want this because there are too many references
      <use *sA>
   else
      <use *sB>
}

有没有办法在函数的开头设置指针类型?

使用void指针是不行的,因为每次我使用它时都必须进行转换,并且还需要检查参数以决定如何转换(转换为A或B)。

void my_very_large_function(int type){
   struct A *sA;
   struct B *sB;
   void *ptr;
   if(type == 0)  
      ptr = (struct A *) *sA;  // is there a way in C to make this cast permanent? I think not
   else
      ptr = (struct B *) *sB;
   < now use just ptr >
}

我认为如果一个结构嵌入另一个结构中,我可以使用一个联合,但结构不相似

1 个答案:

答案 0 :(得分:0)

在C中,这是不可能的。在C ++中,您可以使用模板执行此操作,但仍然会很乱。在C中无法实现这一点的原因是因为在编译时必须知道所有结构成员偏移

示例:

struct A {
    int a;
    int b;
};

struct B {
    int b;
    int a;
};
即使您可以编译任何一个函数,

也不兼容。你唯一的方法是为每种类型编译一个函数:

void my_very_large_function_A();
void my_very_large_function_B();

void my_very_large_function(int type){
   if(type == 0)  
      my_very_large_function_A();
   else
      my_very_large_function_B();
}

您可以使用预处理器宏进行半自动化:

my_very_large_function.c:

#ifdef structtype
void NAME(my_very_large_function, structtype)() {
    struct structtype *my_struct;
    // whatever it does
}
#endif

main.c中:

#define PASTER(x,y) x ## _ ## y
#define EVALUATOR(x,y)  PASTER(x,y)
#define NAME(fun, type) EVALUATOR(fun, type)

#define structtype A
#include <my_very_large_function.c>
#define structtype B
#include <my_very_large_function.c>


void my_very_large_function(int type){
   if(type == 0)  
      my_very_large_function_A();
   else
      my_very_large_function_B();
}