kbi*_*irk 5 c++ windows tags variables c-preprocessor
我一直在重复并重构一些代码.我最终改变了一个函数:
void setPerspective(float nearP = 0.1f, float farP = 1000.0f);
Run Code Online (Sandbox Code Playgroud)
至
void setPerspective(float near = 0.1f, float far = 1000.0f);
Run Code Online (Sandbox Code Playgroud)
并开始得到很多奇怪'missing ;'和'missing )'错误.
似乎near并且far正在进行#define中windef.h.很公平; 我会避免使用它们.
但后来我注意到另一个头文件:
void setPerspective(float fov, float aspect, float near, float far);
Run Code Online (Sandbox Code Playgroud)
但我没有遇到麻烦.这两个头文件都有相同的#includes ...
知道为什么我会在一个问题中遇到问题,而不是另一个问题吗?它似乎不是默认参数.它是一些任意排序的#includes可能导致一个头文件而不是另一个头文件的问题?
令牌near和far可能被定义为#define像这样的空白
#define near
#define far
Run Code Online (Sandbox Code Playgroud)
因此预处理器将用null替换它们 - 它们在编译器处理源之前消失.
第一个函数声明包括参数的默认分配
void setPerspective(float nearP = 0.1f, float farP = 1000.0f);
Run Code Online (Sandbox Code Playgroud)
编译器正确地将nearP和farP解释为参数名称和float类型.当您更改nearP到near并farP以far预处理器与空替换他们和你有一个分配的float类型......和编译器会引发一个合适的...这是编译器看到的是:
void setPerspective(float = 0.1f, float = 1000.0f);
Run Code Online (Sandbox Code Playgroud)
在第二个头文件中,函数原型中的参数没有默认赋值,并且编译器看到参数是float并且看不到near,far因为它们是null ...所以代替这个
void setPerspective(float fov, float aspect, float near, float far);
Run Code Online (Sandbox Code Playgroud)
编译器看到了这个
void setPerspective(float fov, float aspect, float , float );
Run Code Online (Sandbox Code Playgroud)
这是一个完全合法的函数原型(您不必提供参数名称).
| 归档时间: |
|
| 查看次数: |
473 次 |
| 最近记录: |