我想定义两个同名的函数,但一个对 float4 应用转换,另一个对 float3 应用转换,但它说:
conflicting types for 'mult'
这是不可能的还是我的代码有问题?
typedef struct {
float m[16]; // member elements of the matrix
} mat4;
typedef struct {
float m[9];
} mat3;
float4 mult(mat4 matrix, float4 p) {
return
matrix.m[0] * p.x + matrix.m[1] * p.y + matrix.m[2] * p.z + matrix.m[3] * p.w +
matrix.m[4] * p.x + matrix.m[5] * p.y + matrix.m[6] * p.z + matrix.m[7] * p.w +
matrix.m[8] * p.x + matrix.m[9] * p.y + matrix.m[10] * p.z + matrix.m[11] * p.w +
matrix.m[12] * p.x + matrix.m[13] * p.y + matrix.m[14] * p.z + matrix.m[15] * p.w ;
}
float3 mult(mat4 matrix, float3 p) {
return mult(matrix, float4(p, 1)).xyz;
}
最佳答案
尽管 OpenCL 内置函数利用函数重载来提供具有相同名称的同一函数的不同变体,但 OpenCL C 规范并未明确允许在用户代码中进行函数重载(这也不是 C99 的功能) .
某些基于 Clang 的 OpenCL 实现可能允许您使用 overloadable
函数属性,该属性如下所示:
float4 __attribute__((overloadable)) mult(mat4 matrix, float4 p) {
...
}
float3 __attribute__((overloadable)) mult(mat4 matrix, float3 p) {
...
}
但这不是标准的 OpenCL 功能,并且不保证在所有 OpenCL 平台上工作。为 OpenCL 2.1 提议的 OpenCL C++ 内核语言将原生支持函数重载。
关于opencl - 在 OpenCL 1.1 中定义具有相同名称但不同参数类型的不同函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29277087/