C++ X11/Xlibint.h命名冲突问题:它们是否应该命名为min/max?

C++ X11/Xlibint.h命名冲突问题:它们是否应该命名为min/max?,c++,x11,C++,X11,在尝试编译SFML源代码时,我发现了一个问题,编译器怀疑无法识别std::min,这导致了以下错误: error: expected unqualified-id before ‘(’ token 尽管被宣布了。在进行手动跟踪时,我将罪魁祸首文件缩减为X11/Xlibint.h。进一步检查,我发现这两个隐藏的污点: #define min(a,b) (((a) < (b)) ? (a) : (b)) #define max(a,b) (((a) > (b)) ? (a) : (b)

在尝试编译SFML源代码时,我发现了一个问题,编译器怀疑无法识别std::min,这导致了以下错误:

error: expected unqualified-id before ‘(’ token
尽管被宣布了。在进行手动跟踪时,我将罪魁祸首文件缩减为X11/Xlibint.h。进一步检查,我发现这两个隐藏的污点:

#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))
对于那些只建议在这样一个简单的项目中以另一种方式声明标题的人来说,在大型项目或库中不可能100%确保顺序是正确的(我必须在SFML中跟踪30多个文件以找到冲突的根源),特别是如果有许多文件声明了算法,因为当在X11/libint.h之前声明算法时会发生碰撞(并且给定的算法比X11/libint.h更常用,它更可能按该顺序出现)

它也可能以另一种方式出现,但它更复杂:

#include <X11/Xlibint.h>

//Only defined if X11 already defines it. We redefine it to demonstrate it's used instead of std::min
#ifdef min
#undef min
#define min(a,b) -10;
#endif

int N = min(0,10); //Defined as a macro, implicitly

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int I = min(0,20); //No longer the macro, implicitly
    std::cout<<"N is: "<<N<<" I is: "<<I<<std::endl; //N is -10, I is 0
    return 0;
}
#包括
//仅当X11已定义它时才定义。我们重新定义它,以证明它是用来代替std::min的
#ifdef min
#未定义最小值
#定义最小值(a,b)-10;
#恩迪夫
int N=最小值(0,10)//隐式定义为宏
#包括
#包括
使用名称空间std;
int main()
{
int I=min(0,20);//不再隐式显示宏

STOD: C++是一种恐龙。<代码> MI< <代码> > <代码> max >代码>是它的最小问题。只是代码> > ununDEF< /代码>在任何需要的地方。那么,你的问题是什么?这似乎比实际问题更需要征求意见。你必须记住,X11是很久以前开发的,在C++的崛起之前很久。这些宏严重地被命名了吗?是的。我们应该修复它吗?当然,但该头文件的最终版本将需要20年才能从大多数发行版中消失。我们可以解决它们吗?没问题……我不知道X11的详细信息。我曾假设它是一组维护的系统文件,可以进行修补(但我不知道我将在何处或如何报告)。我不知道这些陷阱,所以我很好奇是否有办法找出是否还有其他陷阱(没有评论或文档?).鉴于它无法修补,我想问题变成了“解决办法是什么?”但我假设是#undef@c1646091它们可以被维护,但“不破坏现有的东西”是(可能的)在维护方面,可以问为什么C++选择定义“代码> STD::MIN < /C>和 STD::MAX < /> >众所周知,X11自从(最有可能)80年代中期以来一直在使用这些代码,同时抱怨X11做出了选择,现在,对于X11报头没有真正设计的语言而言,现在已经中断了。
main.cpp|8|error: expected unqualified-id before ‘(’ token|
#include <X11/Xlibint.h>

//Only defined if X11 already defines it. We redefine it to demonstrate it's used instead of std::min
#ifdef min
#undef min
#define min(a,b) -10;
#endif

int N = min(0,10); //Defined as a macro, implicitly

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int I = min(0,20); //No longer the macro, implicitly
    std::cout<<"N is: "<<N<<" I is: "<<I<<std::endl; //N is -10, I is 0
    return 0;
}