编译错误:cpumask.h:“and”可能不会出现在宏参数列表中

Posted

技术标签:

【中文标题】编译错误:cpumask.h:“and”可能不会出现在宏参数列表中【英文标题】:compile error: cpumask.h: "and" may not appear in macro parameter list 【发布时间】:2009-04-01 08:38:48 【问题描述】:

我正在尝试将项目从旧的 linux 平台迁移到 kubunutu 9.04。现在使用 gcc 4.3.3 编译时出现此错误:

/usr/src/linux-headers-2.6.28-11-generic/include/linux/cpumask.h:600:37: error: "and" may not appear in macro parameter list

如果我理解的信息是正确的,不允许使用“and”作为宏参数,因为它是一个“保留命令”。两个问题:

    这怎么可能?我无法想象linux头文件中有这样的错误......我之前做错了什么吗?我尝试了#undef,但这无济于事。 如何解决此错误?我必须更改 linux 头文件,这不可能是真的,可以吗?

感谢您的帮助。

【问题讨论】:

我所做的是:我将 包含在一个 .hpp 文件中。但在那之前我不做(其他)奇怪的事情......有什么想法吗? 谢谢你们,因为你们,我才明白这是为什么:cpumask.h中定义的宏不符合C++预处理器的限制,因为它是一个C宏。但我仍然想知道是否有一个简单的解决方案来解决这个问题,或者我是唯一一个想要在 .cpp/.hpp 中包含 .h 的人吗? 【参考方案1】:

我认为问题在于and 是keyword in C++ but not C(他们使用&&)。

内核人员有时会使用宏来替代内联函数。然而,有时他们需要宏,因为他们想要做的事情必须在调用函数的范围内完成,而定义一个函数来做这件事是行不通的(例如一个宏来找出当前函数的名称)。

假设所讨论的宏确实是假的内联函数,则可以编写自己的 .c 文件,其中只包含调用这些宏的函数,编译它,然后通过 extern "C" 标头引用这些函数。您将获得相同的行为,但性能稍差(这不太可能成为问题)。

如果宏实际上必须是宏,那么最好的办法是手动编辑它们以使其与 C++ 兼容。

【讨论】:

【参考方案2】:

Linux 头文件是 C 头文件,而不是 C++。

【讨论】:

也许 extern "C" 可以解决这个问题? 不,它不会' - 只是指定链接,而不是语言语法。 当然,我真笨。解决方案是不包含该文件。【参考方案3】:

define for_each_cpu_and(cpu, mask, and) - #define for_each_cpu_and(cpu, mask, and_deb)

找到这个解决方案@http://www.linux.org.ru/forum/development/4797542

【讨论】:

链接分享不是神回答,这里分享一些代码解决方案【参考方案4】:

如果您也显示有问题的行会有所帮助。也许这完全取决于上下文,如果您在包含标头之前做了一些疯狂的事情,编译器可能会感到困惑并生成一个不明显的错误消息。

在某些情况下,“and”确实是一个保留字,如果它是 C++——只有内核开发人员不会太在意,因为内核专注于 C。

【讨论】:

以上是关于编译错误:cpumask.h:“and”可能不会出现在宏参数列表中的主要内容,如果未能解决你的问题,请参考以下文章

解决由于具有可能已删除的默认构造函数的不变成员而导致的编译器错误

合适的不会编译

ng serve 不会编译

强制java以用户输入作为消息进行编译错误

在发布中抛出断言但不是调试 - 一定是编译器错误?

编译失败。 ./src/reportWebVitals.js 中的错误。 reportWebVitals.js:“导入”和“导出”可能只出现在顶层 (3:4)