main.cc
#include <cerrno>
class A {
public:
int errno();
};
int A::errno()
{
return 0;
}
int main()
{
return 0;
}
使用g ++报告错误编译main.cc:
In file included from /usr/include/c++/7/cerrno:42:0,
from 1.cc:1:
main.cc:8:8: error: expected unqualified-id before ‘(’ token
int A::errno()
但是相同的代码可以在g ++ 6及更低版本中成功编译
以下代码由g ++ 7成功编译
#include <cerrno>
class A {
public:
int errno()
{
return 0;
}
};
int main()
{
return 0;
}
有什么想法吗?
答案 0 :(得分:0)
errno
是一个宏。
引用cppreference
宏扩展为POSIX兼容的线程本地错误号变量
如果您在源代码中添加#undef errno
,则会进行编译,但会以某种方式破坏errno的目的。
您根本不应该将方法命名为errno。
要弄清楚为什么它在一种情况下有效而在另一种情况下无效,您需要扩展errno
宏并查看生成的内容。
所以这是输出或编译器尝试编译的内容:
class A {
public:
int (*__errno_location ())(){return 0;}
};
class A {
public:
int(*foo()) ();
};
int A::(*__errno_location ())(){return 0;}