错误:在 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中用啥头文件?

linux__yum工具

如何为 Alpine Linux 中的进程提供`__snprintf_chk`

Linux 内核头文件中的错误