使用联合体和枚举合并两个参数类型不同的C语言函数

ChatGPT4o 使用 ChatGPT 4o 回答

问题:

有两个C语言的函数,他们各自有3个参数,前两个参数类型相同,只有最后一个参数类型不一样。一个是u32类型的,一个u64类型的,请问这两个函数如何合并成一个函数?

回答:

在C语言中,如果你有两个函数,它们的前两个参数类型相同,只有最后一个参数类型不同,你可以通过使用联合体(union)和枚举(enum)来合并这两个函数。以下是一个示例,展示了如何实现这一点:

假设你有以下两个函数:

#include <stdio.h>

typedef unsigned int u32;
typedef unsigned long long u64;

void function_u32(int a, int b, u32 c) {
    printf("function_u32: a = %d, b = %d, c = %u\n", a, b, c);
}

void function_u64(int a, int b, u64 c) {
    printf("function_u64: a = %d, b = %d, c = %llu\n", a, b, c);
}

你可以将它们合并成一个函数,如下所示:

#include <stdio.h>

typedef unsigned int u32;
typedef unsigned long long u64;

typedef enum {
    TYPE_U32,
    TYPE_U64
} ParamType;

typedef union {
    u32 u32_val;
    u64 u64_val;
} ParamValue;

void combined_function(int a, int b, ParamType type, ParamValue value) {
    switch (type) {
        case TYPE_U32:
            printf("combined_function (u32): a = %d, b = %d, c = %u\n", a, b, value.u32_val);
            break;
        case TYPE_U64:
            printf("combined_function (u64): a = %d, b = %d, c = %llu\n", a, b, value.u64_val);
            break;
        default:
            printf("Unknown type\n");
            break;
    }
}

int main() {
    ParamValue value;

    value.u32_val = 123;
    combined_function(1, 2, TYPE_U32, value);

    value.u64_val = 4567890123456789ULL;
    combined_function(3, 4, TYPE_U64, value);

    return 0;
}

在这个示例中,我们定义了一个枚举类型 ParamType 来表示参数的类型(TYPE_U32TYPE_U64),以及一个联合体 ParamValue 来存储参数的值。然后,我们在 combined_function 中使用 switch 语句来处理不同类型的参数。

这样,你就可以通过一个函数来处理不同类型的参数,而不需要定义多个函数。