5

我一直在检查并重构一些代码。我最终改变了一个功能:

void setPerspective(float nearP = 0.1f, float farP = 1000.0f);

void setPerspective(float near = 0.1f, float far = 1000.0f);

并开始出现很多奇怪'missing ;''missing )'错误。

似乎nearfar#definewindef.h. 很公平; 我会避免使用它们。

但后来我注意到另一个头文件:

void setPerspective(float fov, float aspect, float near, float far);

然而我没有遇到任何麻烦。这两个头文件具有相同#include的...

知道为什么我在一个问题上遇到问题,而在另一个问题上却没有吗?它似乎不是默认参数。是否是 s 的某种任意顺序#include可能导致一个头文件而不是另一个头文件出现问题?

4

4 回答 4

7

令牌nearfar可能被定义为 null 在这样的#define

#define near
#define far

所以预处理器会将它们替换为 null - 它们在编译器处理源之前消失。

第一个函数声明包括对参数的默认分配

void setPerspective(float nearP = 0.1f, float farP = 1000.0f);

编译器将 nearP 和 farP 正确解释为参数名称和float类型。当您更改nearPnearfarP更改为far预处理器时,将它们替换为 null 并且您对float类型进行了分配......并且编译器抛出了一个合适的......这就是编译器看到的:

void setPerspective(float  = 0.1f, float  = 1000.0f);

在第二个头文件中,函数原型中的参数没有默认赋值,编译器看到参数是浮动的,没有看到nearfar因为它们是空的......所以而不是这个

void setPerspective(float fov, float aspect, float near, float far);

编译器看到这个

void setPerspective(float fov, float aspect, float , float );

这是一个完全合法的函数原型(您不必给出参数名称)。

于 2012-09-23T22:58:10.927 回答
4

猜测一下,您正在 Windows 机器上进行编译。

很久以前,迷失在时间的迷雾中,有像 Intel 8086、80186 和 80286 这样的机器。在这些机器上,可用内存有限。他们大多使用 16 位指针。但随后程序增长了一点,因此添加了关键字nearfar作为限定符来识别不同大小的指针。

你遇到的是那些黑暗的原始日子的遗留物。Sane 计算机(80386 以上)不需要nearandfar符号,但编译器继续支持它们以实现向后兼容性。

如果此诊断准确,请避免使用名称nearfar; 将它们视为旧版本语言遗留下来的关键字。

于 2012-09-23T22:39:38.640 回答
2

看这篇文章:Near and Far pointers

它们似乎是用于访问不同类型内存的指针类型,但不再使用。

看起来他们被称为nearP和farP是有原因的。:)

于 2012-09-23T22:39:00.513 回答
2

头文件不仅受到它们自己#include的 s 的影响,而且还受到在#include这些头文件之前出现在根源文件中的 s 的影响。

/* foo.cpp */
#include "bar.h"
#include "foo.h" // foo.h is influenced by whatever is brought in by bar.h

标识符farnear(以及其他)是一些针对 8086/88 分段架构(运行 MS-DOS 和 Windows 3.x)的编译器中的扩展。Windows 头文件中可能有一些东西可以支持遗留代码,比如可能#define far(将其定义为空)。

另一方面,您通常应该使用double浮点数。该float类型用于在大型数组中保存存储(它可能小于也可能不小于double)。在具有 IEEE 754 浮点数的平台上,float通常是 32 位数字:它有 7 位指数和 24 位尾数,这很差。而double64 位类型,具有 11 位指数和 52 位尾数:明显更好的范围和精度。

于 2012-09-23T22:44:54.077 回答