2017-01-04 33 views
-1

我正在研究在Linux中运行超过20年的遗留代码。 它有3个模块,由3个不同的人来处理。我只能在一个模块中进行更改。Windows MSG结构与旧版项目代码冲突struct MSG

现在我得到了一个任务,在windows中以最小的功能构建相同的代码。

对于进程间通信,使用消息结构。它与Windows MSG结构相冲突。

该结构也在其他两个模块中使用。

我不想重命名结构。 有没有其他解决方法?代码是C和C++的组合。

+1

将它与命名空间一起使用。 –

+0

MSG结构也在C文件中使用。 C没有名称空间。 – atulya

+0

包装函数和/或包装宏。 – user3386109

回答

2

不是。 One Definition Rule指出每个名称都应该有一个唯一的定义,并且您现有的::MSG的定义与::MSG的定义<Windows.h>不匹配。

Windows编译器不倾向于强制执行ODR,因此您可能会忽略它。你通常会通过两种类型之间的硬性分离来做到这一点。也就是说,在包含windows.h的.cpp文件中,不能包含任何项目标题,反之亦然。两个部分之间的接口必须在它自己的头文件中定义,它不依赖于windows.h或自己的头文件。 (作为一个好处,您可以提供Linux的该.cpp文件的替代实现,这意味着您的代码不会被散布在#ifdef WIN32

+0

第一时间,我想通过项目范围的命令行编译器选项添加诸如'#define MSG _myMSG'之类的东西。''-DMSG = myMSG'或者我认为非常接近的东西。但是,它也会在'windows.h'中触发,除非这个选项只被添加到与窗口无关的代码中,这就意味着需要像你写的那样分离代码。所以..大拇指首先代码分离! – quetzalcoatl

+0

@quetzalcoatl:你当然可以用'#define MSG_before MSG'和'#define MSG MSG_before #undef MSG_before'围绕'#include windows.h'。但这意味着你不能调用相关的窗口函数。 – MSalters

+0

谢谢@MSalters,会试一试。 – atulya

相关问题