我们可以在 C 中的现有函数中声明和定义一个函数吗?

问题描述 投票:0回答:2
void function(int entry, int x1, int x2)
{
    void (*new_func)(int n1, int n2);
    new_func = (void (*)(int, int)) entry;
    
    new_func(x1,x2);
    
}

假设我们有这个函数,有一个函数 new_func 是从函数内部声明、定义和调用的。 这是允许的吗?这可能吗?

此代码正在编译,但在调试时似乎正在退出。

c function pointers
2个回答
0
投票

嵌套函数不是标准的一部分。但是,一些编译器支持将其作为扩展。喜欢

gcc
。在此处阅读有关 C 中嵌套函数的更多信息C 中的嵌套函数

然而,这不是这里发生的事情。在您的代码中,它是一个函数指针。在这里阅读更多相关信息:C 中的函数指针如何工作?

在没有看到整个代码的情况下,我会说

entry
可能有错误的类型。应该是
intptr_t
或者
uintptr_t
uintptr_t 数据类型是什么?


0
投票

首先,

new_func
不是一个函数,它是一个函数指针。

您在问题中显示的代码片段正在将

int
值转换为函数指针类型并将其分配给
new_func
:

new_func = (void (*)(int, int)) entry;

但是您没有提到传递给

entry
函数的
function()
参数的参数。
您是否键入将函数指针转换为
int
并将其作为第一个参数传递给函数
function()

您的程序可以具有实现定义的行为或未定义的行为,具体取决于传递的第一个参数的值

function()
函数。

来自C11#6.3.2.3p5

5 整数可以转换为任何指针类型。除非先前指定,否则结果是实现定义的,可能未正确对齐,可能未指向引用类型的实体,并且可能是陷阱表示。 67)

来自C11#6.3.2.3p6

6 任何指针类型都可以转换为整数类型。除了前面指定的,结果是实现定义的。如果结果不能用整数类型表示,则行为未定义。结果不必在任何整数类型的值范围内。

© www.soinside.com 2019 - 2024. All rights reserved.