错误:在 Linux (Centos) 中的“__extension__”之前预期的 unqualified-id
Posted
技术标签:
【中文标题】错误:在 Linux (Centos) 中的“__extension__”之前预期的 unqualified-id【英文标题】:error: expected unqualified-id before ‘__extension__’ in Linux (Cent OS) 【发布时间】:2014-04-15 09:41:53 【问题描述】:我的代码如下,
namespace A
namespace B
unsigned int htonl(unsigned int address)
return 0;
现在我知道htonl
是Linux 中的一个库函数。即使我在命名空间下定义它,它也会产生上述错误。如何在不更改函数签名的情况下修复它?
【问题讨论】:
可能htnol()
是一个宏。您应该研究预处理器的输出,并且(当然)删除相关的#include
(s),我假设您从问题中省略了。另外我将它重新标记为 C++,因为 namespace
不是 C。
就没有别的办法了吗?谢谢。
【参考方案1】:
这里的问题是,至少在 Linux 中,htonl
是一个(有时)扩展为 __bswap32
的宏,而 __bswap32
又是一个相当长的宏(其中有 __attribute__((extension))
)。宏不“关心”名称空间。
如果您真的想要自己的函数,称为 htonl
(一般情况下您可能不想要 - 将其称为其他名称),那么您可以这样做
#ifdef htonl
#undef htonl
#endif
#ifdef
用于避免取消定义非宏的内容。
或者您可以找出生成htonl
(在我的Linux 安装中为<arpa/inet.h>
)的头文件,而不是将其包含在您的代码中。
【讨论】:
【参考方案2】:首先,可能值得注意的是库函数htonl
接受并返回uint32_t
。其次,正如其中一位评论者所说,它是一个宏,至少在 Linux 上是这样,在netinet/in.h
中定义为__bswap_32(x)
。
因此,您的选择仅限于避免预处理器在编译前替换宏扩展的方法:
a) 重命名函数。
b) 避免包含文件。在函数定义之后移动它,或者完全删除它。请注意,您随后需要使用命名空间限定符调用此函数,例如 A::B::htonl
,否则预处理器也会在那里替换它。
c) 取消定义宏。但是,如果您稍后想要恢复原始定义,这将是有问题的。
【讨论】:
【参考方案3】:使用 ::htons 调用 - 在 api 名称前添加“::”。
【讨论】:
这实际上并没有回答问题。以上是关于错误:在 Linux (Centos) 中的“__extension__”之前预期的 unqualified-id的主要内容,如果未能解决你的问题,请参考以下文章
Linux centos7中安装任何软件使用yum失败显示 Loaded plugins: fastestmirror, langpacks,大神们,求教
Centos 7.7 上的 Vscode 无法识别 Intel AVX 功能,关于 __mm256i 的错误
linux中的linux/types.h 在windows中用啥头文件?