确定使用空指针传递了什么函数(char int ore Failure)

时间:2019-01-10 19:27:37

标签: c

我传递了一个指向函数的空指针。

由于int和char之间的函数求值略有不同,因此我想在函数中确定是否获得int或char或传递的另一个值。

在没有调用该函数的程序员必须传递另一个变量来告诉该函数正在处理什么值的情况下,该如何做到这一点。

非常出色:

int func (void *value) {
  if (int) {
    //Process
  }
  if else (char) {
    //Process
  }
  else {
    //Failure
  }

2 个答案:

答案 0 :(得分:3)

不能,void *是通用的,无法知道原始类型,请考虑使用union

enum type {TYPE_INT, TYPE_CHAR);

struct mytype {
    enum type;
    union {
        int *as_int;
        char *as_char;
    } data;
};

并将其传递给函数:

int func(struct mytype *mydata) {
  if (mydata->type == TYPE_INT) {
      return *(mydata->data.as_int);
  } else {
      //Process
  }
  ...

在C11下,您可以使用匿名union,然后可以省略union名称:

struct mytype {
    enum type;
    union {
        int *as_int;
        char *as_char;
    };
};
...
  if (mydata->type == TYPE_INT) {
      return *(mydata->as_int);

答案 1 :(得分:3)

  

如何做到这一点而无需程序员调用此函数而不必传递另一个变量来告诉该函数正在处理什么值(?)

如果您只能传递void*以外的其他内容,请使用_Generic(自C11起)减轻调用者的负担,并引导代码调用所需的函数。这种方法使用类似于@tadman注释的宏来引导代码。


void func_int(int x) {
  printf("int: %d\n", x);
}

void func_char(char x) {
  printf("char: %c\n", x);
}

#define func(X) _Generic((X), \
  int: func_int, \
  char: func_char \
)(X)

用法。呼叫者无需指定一种实现的类型:intchar。只需使用func()

int main() {
  int i = 42;
  char c = 'X';
  func(i);
  func(c);
}

输出

int: 42
char: X