近乎不一致

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正在进行#definewindef.h.很公平; 我会避免使用它们.

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

void setPerspective(float fov, float aspect, float near, float far);
Run Code Online (Sandbox Code Playgroud)

但我没有遇到麻烦.这两个头文件都有相同的#includes ...

知道为什么我会在一个问题中遇到问题,而不是另一个问题吗?它似乎不是默认参数.它是一些任意排序的#includes可能导致一个头文件而不是另一个头文件的问题?

amd*_*mdn 7

令牌nearfar可能被定义为#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类型.当您更改nearPnearfarPfar预处理器与空替换他们和你有一个分配的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)

这是一个完全合法的函数原型(您不必提供参数名称).