gpt4 book ai didi

c - C 中的伪泛型

转载 作者:太空狗 更新时间:2023-10-29 16:22:43 24 4
gpt4 key购买 nike

我需要实现一些方法来处理不同类型的数字数组。通常,我会为这项工作使用泛型,但由于 C 不提供它们,我现在正尝试使用宏来模拟它们。

这是我正在尝试做的一个例子:

#ifndef TYPE
#define TYPE int
#endif

TYPE get_minimum_##TYPE (TYPE * nums, int len){
TYPE min = nums[0];

for (int i = 1; i < len; i++) {
if (nums[i] < min) {
min = nums[i];
}
}

return min;
}

但是,这不会编译。 clang 错误信息:

error: expected ';' after top level declarator

有什么办法可以在 C 中做到这一点吗?还是我需要为每种类型手动实现它?

最佳答案

你可以在头文件中做这样的事情:

//
// generic.h
//

#define TOKENPASTE(x, y) x ## y

#define GET_MINIMUM(T) TOKENPASTE(get_minimum_, T)

TYPE GET_MINIMUM (TYPE) (TYPE * nums, size_t len){
TYPE min = nums[0];

for (size_t i = 1; i < len; i++) {
if (nums[i] < min) {
min = nums[i];
}
}

return min;
}

然后 #include 它在每个所需类型的源文件中,例如:

//
// generic.c
//

#define TYPE int
#include "generic.h"
#undef TYPE

#define TYPE float
#include "generic.h"
#undef TYPE

您可以通过预处理器运行它来测试它:

$ gcc -E generic.c 

int get_minimum_int (int * nums, size_t len){
int min = nums[0];

for (size_t i = 1; i < len; i++) {
if (nums[i] < min) {
min = nums[i];
}
}

return min;
}

float get_minimum_float (float * nums, size_t len){
float min = nums[0];

for (size_t i = 1; i < len; i++) {
if (nums[i] < min) {
min = nums[i];
}
}

return min;
}

关于c - C 中的伪泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16522341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com