作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我一直在检查并重构一些代码。我最终改变了一个函数:
void setPerspective(float nearP = 0.1f, float farP = 1000.0f);
到
void setPerspective(float near = 0.1f, float far = 1000.0f);
并开始出现许多奇怪的 'missing ;'
和 'missing )'
错误。
near
和far
似乎是windef.h
中的#define
d。很公平;我会避免使用它们。
但后来我在另一个头文件中注意到:
void setPerspective(float fov, float aspect, float near, float far);
但我没有遇到任何麻烦。这两个头文件都有相同的#include
...
知道为什么我在一个中遇到问题,而在另一个中却没有吗?它似乎不是默认参数。 #include
的某种任意排序是否可能导致一个头文件出现问题而不是另一个头文件?
最佳答案
标记 near
和 far
可能在像这样的空 #define
中定义为 null
#define near
#define far
因此预处理器会将它们替换为 null - 它们会在编译器处理源代码之前消失。
第一个函数声明包括对参数的默认赋值
void setPerspective(float nearP = 0.1f, float farP = 1000.0f);
编译器正确地将 nearP 和 farP 解释为参数名称,并将 float
解释为类型。当您将 nearP
更改为 near
并将 farP
更改为 far
时,预处理器会将它们替换为 null 并且您有一个分配给 float
类型......编译器会抛出一个合适的......这是编译器看到的:
void setPerspective(float = 0.1f, float = 1000.0f);
在第二个头文件中,函数原型(prototype)中的参数没有默认赋值,编译器看到参数是float,看不到near
和far
因为它们是空的...所以而不是这个
void setPerspective(float fov, float aspect, float near, float far);
编译器看到了这个
void setPerspective(float fov, float aspect, float , float );
这是一个完全合法的函数原型(prototype)(您不必给参数名称)。
关于c++ - 远近不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12556835/
我是一名优秀的程序员,十分优秀!