gpt4 book ai didi

c - 使用仅在运行时初始化的函数指针解析 [-Werror=maybe-uninitialized]

转载 作者:行者123 更新时间:2023-11-30 19:55:46 25 4
gpt4 key购买 nike

我正在用 C11 编写一段代码,这应该会让我以后的程序生活更轻松。我有一个想要调用的通用 intersect 函数。然而,根据某些情况,intersect 函数实际上可能是一个不同的函数。

请注意,intersect 第三个参数的指针类型取决于 switch 情况,因此我无法真正概括它。

getnormal 也会出现相同的错误。

错误:

error: ‘intersect’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
57 | current_t = intersect(origin, direction, objects[i]);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

代码:


float inline iPlane(vec3 origin, vec3 direction, plane * pla);
float inline iTriangle(vec3 origin, vec3 direction, triangle * tri);
float inline iSphere(vec3 origin, vec3 direction, sphere * sph);

vec3 inline nTriangle(triangle * obj, vec3 position);
vec3 inline nPlane(plane * obj, vec3 position);
vec3 inline nSphere(sphere * obj, vec3 position);


float current_t;

vec3 (*getnormal)();
float (*intersect)();

object * nearest_obj = NULL;
for (int i = 0; i < object_count; ++i)
{
switch(objects[i]->shape){ // shape = enum{sphereobj, triangleobj, planeobj}
case triangleobj:
getnormal = &nTriangle; // real function that exists
intersect = &iTriangle; // also a real function that exists
break;
case sphereobj:
getnormal = &nSphere;
intersect = &iSphere;
break;
case planeobj:
getnormal = &nPlane;
intersect = &iPlane;
break;
}

current_t = intersect(origin, direction, objects[i]); // error here
}

最佳答案

要消除警告,只需将函数指针变量初始化为 0 即可。

float (*intersect)() = NULL;

然后在使用它之前,检查它是否已初始化(以防万一所有枚举都没有包含在 switch 语句中,在这种情况下会引发另一个警告,但安全总比抱歉好)

assert (intersect);

或不带断言(可以通过某些编译器开关消除)

if (!intersect)
{
// handle the error
}

如果这种情况可能发生:

if (intersect)
{
current_t = intersect(origin, direction, objects[i]);
}
else
{
current_t = 0.0; // some default value else you get the "uninitialized error" with current_t
}

关于c - 使用仅在运行时初始化的函数指针解析 [-Werror=maybe-uninitialized],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58344013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com