C++ sys/sysmacros.h中定义的主要宏和次要宏由<;迭代器>;

C++ sys/sysmacros.h中定义的主要宏和次要宏由<;迭代器>;,c++,macros,glibc,libstdc++,C++,Macros,Glibc,Libstdc++,我正在编写一个具有类似矩阵结构的类,我希望有一个名为minor的成员函数与矩阵运算相同。这会引发一些错误。我的系统上的最小测试用例: #include <iterator> void minor(int row, int col); sys/sysmacros.h的相关部分是: /* Access the functions with their traditional names. */ # define major(dev) gnu_dev_major (dev) # def

我正在编写一个具有类似矩阵结构的类,我希望有一个名为minor的成员函数与矩阵运算相同。这会引发一些错误。我的系统上的最小测试用例:

#include <iterator>
void minor(int row, int col);
sys/sysmacros.h的相关部分是:

/* Access the functions with their traditional names.  */
# define major(dev) gnu_dev_major (dev)
# define minor(dev) gnu_dev_minor (dev)
# define makedev(maj, min) gnu_dev_makedev (maj, min)

显然,这些特定的宏可以是ununf,但看起来很傻,这样的主词和小调的常规词将被定义为宏,特别是当在C++标准库的一部分中拉入时。是否有某些原因需要对其进行定义?这是我使用的标准库中的错误吗?(LeBSTDC++4.82.如Debian测试)

< P>根据C++标准,这些名称不应保留到实现,因此可用。 根据
man 3 makedev

中未指定makedev()、major()和minor()函数 POSIX.1,但在许多其他系统上都存在

这些接口被定义为宏。自glibc 2.3.3以来 有三个GNU特定功能的别名: gnu_dev_makedev()、gnu_dev_major()和gnu_dev_minor()。后者 可以导出名称,但传统名称更便于移植

它们似乎不是为了向后兼容而被删除的(例如)

我认为你可以在没有重大问题的情况下取消对它们的定义(许多项目都是以这种方式进行的)

使用/CLANG/您还可以执行以下操作:

#pragma push_macro("minor")
#undef minor

// do what you need

#pragma pop_macro("minor")
这很难看,但有助于命名冲突

此外,根据代码的结构,此技巧可能很有用:

#define minor(dev) gnu_dev_major(dev)

void (minor)(int row, int col) { /* ... */ }

在函数定义行中,“minor”后面的字符是一个右括号,因此它不是宏调用。

Try
-std=c++11-ansi
Adding-ansi使最小的测试用例正常工作,但它会在我的项目中的其他地方触发错误,因此我无法启用它,至少在短期内如此。除了-ansi之外还有其他选项吗?谢谢你提供了指向Redhat bug的指针。我向gcc提交了一个bug,因为-std=c++11不应该引入这些宏。Jonathan Wakely在我提交的文件中注明,在4.9版本发布后,解决这个问题是通用的。
#define minor(dev) gnu_dev_major(dev)

void (minor)(int row, int col) { /* ... */ }