在我们看到代码是否应该可编译之前,还有很多空白需要填补:
- 类型
sphere
?
- 类型
vector_3d
?
- 变量
t
?
当我们为这些类型提出看似合理的假设时,如以下代码(文件sphere.c
):
typedef struct
{
float x,y,z;
} position_3d;
typedef struct
{
float x, y, z;
} vector_3d;
typedef struct
{
vector_3d direction;
position_3d startPosition;
} ray;
typedef struct
{
float radius;
position_3d centre;
} sphere;
position_3d getIntersectionPosition(ray r, sphere s)
{
position_3d pos;
float t = s.radius;
pos.x = r.startPosition.x + t*r.direction.x;
pos.y = r.startPosition.y + t*r.direction.y;
pos.z = r.startPosition.z + t*r.direction.z;
return pos;
}
position_3d func(ray r, sphere s)
{
position_3d pos = getIntersectionPosition(r, s);
return pos;
}
然后我可以编译使用:
$ /usr/bin/gcc -O3 -g -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
-Wold-style-definition -c sphere.c
sphere.c:24: warning: no previous prototype for ‘getIntersectionPosition’
sphere.c:35: warning: no previous prototype for ‘func’
$
这些警告是正确的;它们由-Wmissing-prototypes
选项提示。通常,会有一个声明类型和函数的标题。
因此,通过演示,如果编写得当,代码可能是正确的。在 C 中,您不能修改代码以使其显示为:
ray r;
sphere s;
position_3d pos = getIntersectionPosition(r, s);
position_3d func(void)
{
return pos;
}
然后发出警告:
sphere.c:43: error: initializer element is not constant
但是,如果您使用g++
而不是编译gcc
(并删除特定于 C 的选项,离开):
$ g++ -O3 -g -Wall -Wextra -c sphere.c
$
然后它可以干净地编译——再次证明 C 和 C++ 不是同一种语言,而不是你声称的那样。
我得到的错误不是你声称得到的错误。这意味着我无法准确猜测您在代码中所做的事情。所以,请:
- 修改此示例代码,直到它重现您遇到的错误。请注意,编译不需要头文件,不需要库(我们只需要获取一个目标文件,因此库是无关紧要的;除了标准头文件之外,您没有使用任何东西,看起来(最多),但删除了所有相关的头文件到 GL)。允许使用 C 标准或 POSIX 标准的标头,但不是必需的。
- 将此代码的修改添加到问题的末尾(保持现有材料不变)。
- 显示您在这组严格的 C 编译选项下得到的确切编译器警告。(这意味着应该至少有两个警告——因为缺少以前的原型。但也应该有一个错误,你声称的那个会阻止你的代码工作。)我们应该能够关联你的错误中的行号对您显示的代码微不足道的消息。