在我的ubuntu系统上,我编写了使用activemq-cpp 3.6.0和mman.h的代码,并且有一个棘手的编译错误。
我写了一个非常简单的代码来验证这个问题:
#include <sys/mman.h>
#include <activemq/core/ActiveMQConnection.h>
int main(int argc, char** argv)
{
return 0;
}
这是编译错误消息:
g++ -c -O2 -D_INTEL686 -D_LINUX -I. -I.. -I/home/matt/devspace/trading-apps/../trading-dependency/activemq-cpp/include/activemq-cpp-3.6.0 -I/home/matt/devspace/trading-apps/../trading-dependency/apr/include/apr-1 mqtest.cpp -o mqtest.o
In file included from /usr/include/x86_64-linux-gnu/sys/mman.h:41:0,
from mqtest.cpp:2:
/home/matt/devspace/trading-apps/../trading-dependency/activemq-cpp/include/activemq-cpp-3.6.0/activemq/util/PrimitiveValueNode.h:56:13: error: expected identifier before numeric constant
MAP_TYPE = 11,
如果我把&#34; mman.h&#34;在&#34; activemq / core / ActiveMQConnection.h&#34;之后,它会没问题。 有人有同样的问题吗?
====== 2015/1/7更新=============================== ============
我对此问题进行了进一步调查。 在&#34; bits / mmap.h&#34;:
# define MAP_TYPE 0x0f /* Mask for type of mapping. */
在&#34; activemq / util / PrimitiveValueNode.h&#34;:
enum PrimitiveType {
...,
MAP_TYPE = 11,
...
}
这是冲突。所以&#34; PrimitiveValueNode.h&#34;必须包括在&#34; mman.h&#34;。
之前我认为这是典型的场景,说明为什么我们不应该在C / C ++代码中使用#define。
答案 0 :(得分:0)
这很可能与某些定义或全局声明的冲突有关。如果在mman.h中定义了某些内容,并且稍后在第二个头中使用了相同的字符串/名称,则可能会导致此类错误。由于编译单元的构建方式,更改include的顺序会有所帮助 - 有问题的定义是稍后的。我有这样的情况很多次,但有不同的标题。