下面的代码可以工作,我认为double(double)和double (*)(double)、square和&square之间没有什么不同,对吗?
#include <stdio.h>
double square(double x)
{
return x*x;
}
void test1(double f(double), double x)
{
printf("test1 %f\n", f(x));
}
void test2(double (*f)(double), double x)
{
printf("test2 %f\n", f(x));
}
int main()
{
double (*fp)(double);
test1(square, 3);
test2(square, 3);
fp = square;
test1(fp, 3);
test2(fp, 3);
fp = □
test1(fp, 3);
test2(fp, 3);
return 0;
}但是下面的cython引发不能将'double (*)(double)‘类型分配给'double (double)',它是一个bug还是我遗漏了什么?
from libc.stdio cimport printf
cdef double square(double x):
return x*x
cdef void test1(double f(double), double x):
printf("test1=%g\n", f(x))
cdef void test2(double (*f)(double), double x):
printf("test2=%g\n", f(x))
def test():
cdef double(*fp)(double)
fp = square
test1(fp, 3.0)
test2(fp, 3.0)发布于 2014-08-17 00:11:20
具体地在函数参数列表中使用这个表示法时,没有什么不同。
但在函数参数上下文之外,double(double)是函数类型,double (*)(double)是函数指针类型。这是两种不同的类型,具有非常不同的属性。
因此,您的第一段的答案是:在函数参数列表中是正确的,而且只在函数参数列表中是正确的。
换句话说,在函数参数列表函数类型中使用时,函数类型的行为方式与数组类型非常相似:它会立即衰退为指针类型。然而,正如数组和指针类型非常不同一样,函数类型和函数指针类型也有很大的不同。
在其他上下文中,如果以double(double)类型声明某项内容,则将其声明为函数。例如
typedef double D(double);
D foo;
double foo(double);上述两种声明都是有效的和等价的。它们声明函数foo,该函数接受double类型的单个参数并返回double。这个特性(通过typedef名称声明函数)通常不在实际的C代码中使用,但是它在语言中是存在的。
发布于 2014-08-17 00:12:00
double(double)是一种函数的类型,它接受一个双,然后返回一个双。
double(*)(double)是指向上述函数类型的指针。
恰巧的是,如果你用力地呼吸,函数就会衰减为指针到函数。例如,不能将一个函数作为另一个函数的参数。如果尝试,类型“衰变”为函数指针。类似地,如果将函数按名称传递为参数(或通常在表达式中传递),则如果目标类型不是对函数的引用或其他类似类型,则它可以自动衰减为函数指针。
数组也会发生类似的情况。
您还可以在指针到函数上调用操作符(),它会自动取消指针的引用.
这些是继承自C.
在C++中,您可以形成对函数的引用,有时还可以使用纯函数类型。std::function< void(int) >采用纯函数类型。现在,它不能创建void(int)类型的变量,但仍然可以操作该类型。
cython可能没有实现自动转换衰变。
发布于 2014-08-17 00:07:27
double(double)在语义上与double (*)(double)在参数上完全等价:函数和数组是通过引用传递的.但是,作为局部变量,double(double)类型的变量永远不可能是lvalue。当然,在全球范围内,它们都是功能。
&square和square一样,后者只是第一个词的语法糖。
我对cython没有经验,但就C语义而言,它似乎不兼容。
https://stackoverflow.com/questions/25345109
复制相似问题