c有没有办法测试变量的类型?还是超载方法?

时间:2012-10-25 05:56:50

标签: c overloading variable-types

我需要将int或字符串传递给堆栈的push函数。通常我只是重载函数并有一个接受一个字符串参数和一个接受一个int参数,以便只根据参数调用相应的函数。我在评论中写了一些我通常会包含类型的地方。我刚刚被困在那里。

void push(Stack *S, /* int or a string */ element)
{        
    /* If the stack is full, we cannot push an element into it as there is no space for it.*/        
    if(S->size == S->capacity)        
    {                
        printf("Stack is Full\n");        
    }        
    else        
    {                
        /* Push an element on the top of it and increase its size by one*/ 

        if (/* element is an int*/)
            S->elements[S->size++] = element; 
        else if (/* element is a string */)
            S->charElements[S->size++] = element;
    }        
    return;
}

5 个答案:

答案 0 :(得分:3)

在这种情况下,您可以使用union并自动为您管理内容:

typedef union {
   int integer; 
   char* string;
} Item;

或者无论如何都需要进行类型检查,您可以使用struct类型和union内部:

typedef enum { INTEGER, STRING } Type;

typedef struct
{
  Type type;
  union {
  int integer;
  char *string;
  } value;
} Item;

答案 1 :(得分:1)

如果您的编译器已经实现了C11的那部分,那么您可以使用新功能_Generic。 clang,例如,已经实现了这个,对于gcc和cousins,有一些方法可以模拟该功能:P99

它通常通过宏工作,类似这样

#define STRING_OR_INT(X) _Generic((X), int: my_int_function, char const*: my_str_function)(X)

答案 2 :(得分:0)

c中没有函数重载。

您可以将类型作为参数传递,使元素参数成为指针,然后将指针重新转换为适当的类型。

答案 3 :(得分:0)

您必须使用仅使用该语言提供的功能。我不认为有一种方法来检查变量是否是C中的字符串或int。而且元素不能保存字符串和int在这里要小心。所以去功能重载。祝你好运

答案 4 :(得分:0)

你可以这样试试

void push (Stack *S,void *element)
    {
     (*element) //access using dereferencing of pointer by converting it to int
     element // incase of char array
    }

    //from calling enviroment
    int i =10;
    char *str="hello world"
    push(S,&i) //in case of int pass address of int
    push(S,str) // in case of char array