gpt4 book ai didi

c++ - 引入的 sys/sysmacros.h 中定义的主要和次要宏

转载 作者:IT老高 更新时间:2023-10-28 22:14:25 28 4
gpt4 key购买 nike

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

#include <iterator>
void minor(int row, int col);

编译时,clang 提供以下错误:

$ clang++ -Weverything -std=c++11 test.cpp 
test.cpp:2:21: error: too many arguments provided to function-like macro invocation
void minor(int row, int col);
^
/usr/include/x86_64-linux-gnu/sys/sysmacros.h:67:10: note: macro 'minor' defined here
# define minor(dev) gnu_dev_minor (dev)
^
test.cpp:2:6: error: variable has incomplete type 'void'
void minor(int row, int col);
^
2 errors generated.
$

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)

很明显,这些特定的宏可以是#undef'd,但是将诸如major 和minor 之类的常规词定义为宏似乎很愚蠢,尤其是在引入C++ 标准库的一部分时。有什么理由需要定义这些吗?这是我正在使用的标准库中的错误吗? (Debian 测试中的 libstdc++ 4.8.2)

最佳答案

根据 C++ 标准,这些名称不应保留给实现并因此可用。

根据man 3 makedev:

The makedev(), major(), and minor() functions are not specified inPOSIX.1, but are present on many other systems

These interfaces are defined as macros. Since glibc 2.3.3, theyhave been aliases for three GNU-specific functions:gnu_dev_makedev(), gnu_dev_major(), and gnu_dev_minor(). The latternames are exported, but the traditional names are more portable.

似乎它们并没有因为向后兼容性而被删除(例如 https://bugzilla.redhat.com/show_bug.cgi?id=130601 )。

我认为您可以#undef 它们而不会出现重大问题(许多项目都以这种方式进行)。

G++/CLANG/MSVC你也可以这样做:

#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'后面的字符是右括号,所以不是宏调用。

关于c++ - <iterator> 引入的 sys/sysmacros.h 中定义的主要和次要宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22240973/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com