【发布时间】:2015-07-29 22:30:35
【问题描述】:
你好 StackOverflow 社区
我已经搜索了很长时间,但没有找到解决问题的方法。 我现在正在做一个项目,我必须将 Windows 工具移植到 Linux 操作系统(具体来说是 Ubuntu 12.04LTS)。 基于 Windows 的工具是用 C++ 编写的,因此我试图在 Linux 上用 C++ 重写该工具。 我目前面临的问题是,在 Windows 解决方案中有一部分使用“MSG”。 这里是来自 Windows 解决方案的代码片段:
/** Callback to send CAN message */
#define CB_SEND_MSG( MSG ) CanWriteCB( MSG )
我已经实现了 CanWriteCB 方法,但我没有找到与“MSG”等效的 Linux。我在包含文件“WinUser.h”的 Windows 工具中找到了 MSG 的声明。如下所示:
/*
* Message structure
*/
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
#ifdef _MAC
DWORD lPrivate;
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
我不知道它是否对你有帮助,但这也是“CanWriteCB”方法的实现:
boolean_t CanWriteCB( Can_Msg *msg )
{
return (CanDispatcher_SendMsgByCanBus( msg ) == CanDisp_Err_Ok ) ? TRUE : FALSE;
}
const Det_Config detCfg =
{
WriteDebugErrorData
};
有人知道如何在 Linux 平台上实现这种结构吗?我发现的唯一一件事是如何创建消息队列,但我完全不知道这对我有什么帮助?
感谢您的宝贵时间
最好的问候 亚历克斯
【问题讨论】:
-
MSG在发布的代码中甚至不是类型名称 - 它是宏参数名称。也可能是x。 -
我知道。问题是,当我右键单击“MSG”以检查“MSG”的定义时,我会被重定向到我在上面的 WinUser 头文件中发布的 CodeSnippet。因此,我认为这两者之间肯定存在关系。我真的需要这个宏吗?它不是比只调用 CanWriteCB 函数而不是宏更复杂吗?或者如果我这样做,整个项目会被搞砸吗?
-
您的 IDE 误导了您。您不应该尝试获取 MSG 的定义 - 它只是一个宏参数名称。它不是类型,它没有定义。
-
所以最后它只是一个“错误”,它向我展示了 WinUser.h 中的定义,并且它只是“偶然”具有相同的名称并且根本不相关。这一点很好,但没有回答,为什么我的 IDE(顺便说一句。Eclipse)向我显示 MSG 尚未声明的错误消息?也许我完全走错了路,只是没有得到简单的解决方案。我在 cmets 中问的另一个问题呢?如果我只在需要的地方调用函数,它会以同样的方式工作吗?还是宏背后有某种魔力?顺便谢谢大家的支持!
标签: c++ linux windows porting can-bus