C语言 如何使用typeof函数创建另一个具有相同类型的函数

g2ieeal7  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(133)

例如:

int f(int a, int b)
{
    return a + b;
}

typeof(f) f2
{
    return -f(a, b);
}

这样的事情在C中可能发生吗?
编辑:我问这个问题的原因是我想做的事情是:

#define MAKE_NEGATION_OF(function) \
typeof(function) function##_negated { \
    return -function(a, b); \
}
zd287kbt

zd287kbt1#

我想使用一个宏来生成一个具有相同类型但不同返回值的函数。
请注意,你的两个例子(过去)不同(在问题被编辑之前)。
在前面的 typeof 例子中,你可以编写一个宏,生成具有相同签名的函数,不同之处仅在于键标记:

#include <stdio.h>

#define DEFINE_BINARY_OPERATION(name, op) \
    int name(int a, int b) { \
        return a op b; \
    }

DEFINE_BINARY_OPERATION(add, +)
DEFINE_BINARY_OPERATION(subtract, -)

int main(void)
{
    printf("%d\n", add(5, 6));
    printf("%d\n", subtract(5, 6));
}
11
-1

给定 macro 的例子,不需要另一个函数,只需在宏 Package 器中否定函数调用。

#include <stdio.h>

#define add_negated(...) (-add(__VA_ARGS__))

int add(int a, int b)
{
    return a + b;
}

int main(void)
{
    printf("%d\n", add(5, 6));
    printf("%d\n", add_negated(5, 6));
}
11
-11

如果你需要一个函数指针,那么这是两种思想的一个非常严格的组合,根本不能很好地扩展。如果您的实际用例是不平凡的,那么您可能应该手工编写函数及其签名。

#include <stdio.h>

#define DEFINE_BINARY_EXPRESSION(name, expr) \
    int name(int a, int b) { \
        return expr; \
    }
#define NEGATE_BINARY_EXPRESSION(name) \
    DEFINE_BINARY_EXPRESSION(name##_negated, -name(a, b))

DEFINE_BINARY_EXPRESSION(add, a + b)
NEGATE_BINARY_EXPRESSION(add)

DEFINE_BINARY_EXPRESSION(subtract, a - b)
NEGATE_BINARY_EXPRESSION(subtract)

int main(void)
{
    printf("%d\n", add(5, 6));
    printf("%d\n", add_negated(5, 6));

    printf("%d\n", subtract(5, 6));
    printf("%d\n", subtract_negated(5, 6));
}
11
-11
-1
1
ctehm74n

ctehm74n2#

函数不能用typedeftypeof表达式创建,因为这些类型不包含任何关于参数名称的信息,并且函数定义需要其参数的名称。
虽然你可以用typedeftypeof * 声明 * 一个函数,但你不能用那种方式 * 定义 * 一个函数。

dojqjjoe

dojqjjoe3#

在C语言中,你不能像在其他语言中一样,使用typeof构造或类似的机制直接创建一个与另一个函数类型相同的新函数。
但是,您可以通过使用函数指针并定义与现有函数具有相同签名(参数类型和返回类型)的新函数来实现相对类似的功能。下面是一个示例:

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

int main() {
    // Define a function pointer type with the same signature as 'add'
    typedef int (*BinaryIntFunction)(int, int);

    // Create a function pointer variable and assign 'add' to it
    BinaryIntFunction operation = add;

    // Use the function pointer to call 'add'
    int result = operation(5, 3);
    printf("Result: %d\n", result); // Output: Result: 8

    // Assign 'subtract' to the same function pointer variable
    operation = subtract;

    // Use the function pointer to call 'subtract'
    result = operation(5, 3);
    printf("Result: %d\n", result); // Output: Result: 2

    return 0;
}

相关问题