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

时间:2009-04-01 08:38:48

标签: c++ gcc

我正在尝试将项目从旧的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

如果我理解正确的消息,则不允许使用“和”作为宏参数,因为它是“保留命令”。关于这两个问题:

  1. 这怎么可能?我无法想象linux头文件中存在这样的错误......我之前做错了什么?我尝试了#undef,但这无济于事。
  2. 如何解决此错误?我不得不改变linux头文件,可以吗?
  3. 感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

linux标头是C标头,而不是C ++。

答案 1 :(得分:1)

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

内核人员有时会将宏作为内联函数的替代品。但是,有时它们需要宏,因为他们想要做的事情必须在调用函数的范围内完成,并且定义一个函数来完成它将不起作用(例如,一个宏来查找当前函数的名称) )。

假设有问题的宏真的是伪内联函数,那么就可以编写自己的.c文件,除了调用这些宏的函数,编译它,并通过extern "C"标题引用这些函数。你会得到相同的行为,但性能稍差(这不太可能是一个问题)。

如果宏实际上必须是宏,那么最好的办法是将它们编辑为C ++兼容。

答案 2 :(得分:0)

如果您还显示相关行,这将有所帮助。也许这完全取决于上下文,如果你在包含标题之前做了一些疯狂的事情,编译器可能会混淆并生成一个非显而易见的错误消息。

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

答案 3 :(得分:0)

定义for_each_cpu_and(cpu,mask,和)#define for_each_cpu_and(cpu,mask,and_deb)

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