MinGW x64在成员函数结尾添加“A”

时间:2013-09-25 10:12:37

标签: c++ windows mingw-w64

我有以下代码:

// --- message_queue.hpp ---
namespace vca {
namespace keystone {
namespace messaging {
class VCA_KEYSTONE_DLL_PUBLIC MessageQueue final {
  [...]
  Message PeekMessage();  // <-- Declaration
  [...]
};
}  // namespace messaging
}  // namespace keystone
}  // namespace vca

// --- message_queue.cpp ---
namespace vca {
namespace keystone {
namespace messaging {
Message MessageQueue::PeekMessage() {  // <-- Definition
  [...]
}
}  // namespace messaging
}  // namespace keystone
}  // namespace vca

我从MinGW-builds-4.8.1-x64-posix-seh收到以下奇怪错误:

..\..\lib\messaging\src\message_queue.cpp:281:35: error: no
'vca::keystone::messaging::Message vca::keystone::messaging::MessageQueue::PeekMessageA()'
 member function declared in class 'vca::keystone::messaging::MessageQueue'
 Message MessageQueue::PeekMessage() {
                                  ^

令我困惑的是为什么它说PeekMessageA()函数不存在,A来自哪里?

如果我删除了定义,它将编译,我将得到预期的链接器错误:

lib\messaging\src\task.cpp.1.o: In function
  `vca::keystone::messaging::Task::TaskImpl::PeekMessageA()':
    ../../lib/messaging/src/task.cpp:939:
    undefined reference to `vca::keystone::messaging::MessageQueue::PeekMessageA()'
collect2.exe: error: ld returned 1 exit status

这表明A已添加到Task::TaskImpl::PeekMessageA。什么是A以及为什么gcc在构建文件时没有找到正确的符号编译?

1 个答案:

答案 0 :(得分:2)

Windows API提供了许多功能的两个版本,一个用于 A NSI编码,另一个用于 W ide字符串。通常,编译器选项和标头宏集将未修饰的名称映射到两个版本中的任何一个,并提供TEXT_T宏的合适定义。