如何将"Type"作为参数传递给c中的函数?

Ask*_*ath 9 c types generic-programming

我想编写泛型函数(例如,获取'void**'类型的数组并对此数组做一些事情的函数),这样这个函数将得到元素的类型(在示例中,它将是类型数组中的任何元素)作为参数.

我可以用c做吗?


例如:
我想编写一个获取数组(类型为void**)的函数,并以某种随机方式初始化此数组.
什么是"以某种随机方式"的含义 - 例如作为参数获取的函数:array(在类型void**中),数组中任何元素的类型,index(在int的类型中)并初始化此单元格.

Lun*_*din 12

只有拥有标准C编译器才能_Generic实现此目的,在这种情况下,您可以将关键字用于此目的.您必须为每种支持的类型编写不同的函数.

#include <stdio.h>

#define func(x) _Generic((x), int: func_int, char: func_char)(x);

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

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


int main(void)
{
  int i = 5;
  char c = 'A';

  func(i);
  func(c);
}
Run Code Online (Sandbox Code Playgroud)

输出:

func_int        5
func_char       A
Run Code Online (Sandbox Code Playgroud)

  • 您应该添加[一两个参考](http://en.cppreference.com/w/c/language/generic);仅限 C11。(此外,“标准 C 编译器”基本上没有意义,除非您指定_which_标准。) (2认同)
  • @Lundin 再说一遍,哪个标准?阅读此答案的人完全有可能正在使用 C99 编译器 - 比如说,因为他们所在的学校还没有转向实际的现代编译器,这是令人不安的合理性 - 如果至少没有指定的话,这只会浪费他们的时间。 (2认同)

Sto*_*ica 7

你没有传递"类型".C没有内置的方法来在运行时编码和解码类型信息.对对象进行操作的函数必须静态地知道类型.如果您绝对打算使用指针void,则必须委托知道类型信息的函数.这可以通过回调来完成.例如,标准库函数qsort接受回调以比较对象的值:

void qsort( void *ptr, size_t count, size_t size,
            int (*comp)(const void *, const void *) );
Run Code Online (Sandbox Code Playgroud)

调用代码提供回调,并且在所述回调内部它将回送到它需要比较的静态类型.这是一个怎样通常为指针的作品void,一个定义了一组操作,它需要以抽象形式的类型做,然后要求调用代码提供了实施这些操作.


Sta*_*tan 5

这是一些宏技巧的示例。

函数文件

#ifndef FUNC_H
#define FUNC_H

#define add(a, b, typename) functionAdd##typename(a,b)

/* function declarations */
#define declared(typename) \
typename functionAdd##typename(typename, typename)

declared(int);
declared(float);

#endif
Run Code Online (Sandbox Code Playgroud)

功能文件

#include "func.h"

/* function code */
#define functionAdd(a, b, typename) \
typename functionAdd##typename(typename a, typename b){ \
    return a+b; \
}

/* function bodies (definitions) */
functionAdd(a, b, int)
functionAdd(a, b, float)
Run Code Online (Sandbox Code Playgroud)

主文件

#include <stdio.h>
#include "func.h"

int main()
{
    int x1 = add(1, 2, int);
    float x2 = add(3.0, 4.0, float);
    printf("%d %f\n", x1, x2);  
    return 0;
}
Run Code Online (Sandbox Code Playgroud)