This question already has answers here:
Is there a clean way to prevent windows.h from creating a near & far macro?
                                
                                    (5个答案)
                                
                        
                                5个月前关闭。
            
                    
c++ - 特有的错误-参数尚不存在,直到参数名称更改,然后才能更轻松地断开-LMLPHP注意:f32是浮点型,m4x4是线性4 x 4矩阵。
我有一个功能:
inline m4x4 Orthographic(f32 left, f32 right, f32 bottom, f32 top, f32 nearr, f32 far)

您可能会注意到它拼写错误。这是因为如果我将参数称为“ near”,则代码不会编译。当我将其更改为更接近并进行编译时,情况变得更糟,因为它不再存在。不在调试器中,也没有在反汇编中,名称就消失了,代码的行为也中断了。例如。我将值-1用于近端,将1用于远处,这具有翻转和反转我正在渲染的三角形的行为。当我将函数签名更改为以下代码时,代码按预期工作:
inline m4x4 Orthographic(f32 left, f32 right, f32 bottom, f32 top, f32 nearplane, f32 farplane)

通过更改名称,代码就可以了。我观察到的一件事是它似乎与字符r有关。

我已经更改了名称,更改了参数顺序,进入调试器,更改了函数的主体并查看了反汇编等。参数的顺序没有任何改变。尾随的r似乎很重要,但我不知道为什么,我很困惑。我的汇编知识可能太弱了。以下是几天前深夜在我最后一次访问计算机时试图将其复制并粘贴的代码,并保留了注释。

    inline m4x4  // TODO go through the dissasembly
inline m4x4 Orthographic(f32 left, f32 right, f32 nearr, f32 far, f32 bottom, f32 top)
    //NOTE this is also broken so its not just param order
//Orthographic(f32 left, f32 right, f32 bottom, f32 top, f32 nearr, f32 far)
//Orthographic(f32 left, f32 right, f32 bottom, f32 top, f32 near, f32 far)
{ // TODO this is broken because far doesn't seem to exist???   if i change near to nearr then it compiles but far doesnt exist, if i set it as near then it fails to compile
    m4x4 Result;
    f32 dw = right - left;
    f32 dh = top - bottom;
    //f32 dd = far - near;
    f32 dd = far - nearr;

    f32 width = right + left;
    f32 height = top + bottom;
    //f32 depth = far + near;
    f32 depth = far + nearr;

    Result =
    {
        2/dw, 0.0f, 0.0f, -(width/dw),
        0.0f, 2/dh, 0.0f, -(height/dh),
        0.0f, 0.0f, -2/dd, -(depth/dd),
        0.0f, 0.0f, 0.0f, 1.0f,
    };

    return (Result);
}
#else
    inline m4x4
Orthographic(f32 left, f32 right, f32 bottom, f32 top, f32 nearplane, f32 farplane)
{ //TODO find out what the deal is with f32 near because this shit is crazy and it caused a painful bug
    m4x4 Result;
    f32 dw = right - left;
    f32 dh = top - bottom;
    f32 dd = farplane - nearplane;

    f32 width = right + left;
    f32 height = top + bottom;
    f32 depth = farplane + nearplane;

    Result =
    {
        2/dw, 0.0f, 0.0f, -(width/dw),
        0.0f, 2/dh, 0.0f, -(height/dh),
        0.0f, 0.0f,-2/dd, -(depth/dd),
        0.0f, 0.0f, 0.0f, 1.0f,
    };

    return (Result);
}



#endif


我希望所有参数都应该显示在调试器中,并且它们的值应该出现在逻辑中...我也希望当将附加r添加到ident名称时,它一定不会成功构建和运行,当然至少没有在调试器中,但是...

如果从较近的地方删除了附加的r并且无法编译,则下面是命令行的输出。
maths.h(443):错误c2059:语法错误:';'
maths.h(448):错误c2059:语法错误:';'

在搜寻代码库时,我还没有发现该错误的重要性。 443和448在函数的主体中,并且是具有far和Nearr参数的线。

编辑:我的工作流程涉及在vim中工作并在命令行中进行编译,我使用Visual Studio作为调试器。



使用以下代码示例完全观察问题


#include <stdio.h>
#include <windows.h>

#if 0 //change to 1 to fix
#undef near
#undef far
#endif

float BrokenByMacro(float near, float far)
{
    float Result = near + far;

    return(Result);
}

int main()
{
    float MyFloat = BrokenByMacro(1, 2);
    printf("%f", MyFloat);
    return (0);
}

最佳答案

根据错误格式判断,您正在使用MSVC,并且可能受项目中某处Windows头文件不卫生的影响(windef.hwindows.h是可能的罪魁祸首)。

这些头文件倾向于定义许多经常以微妙的方式与用户代码冲突的宏。在您的特定情况下,您似乎受farnear宏的影响,这些宏通常扩展为空。

如相关SO question中所建议,您可以在适当的位置简单地将它们#undef。尽管我也会考虑您的#include层次结构来限制特定于Windows的标头的范围。

关于c++ - 特有的错误-参数尚不存在,直到参数名称更改,然后才能更轻松地断开,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57258115/

10-11 21:04