函数
MyFunction(std::string)
在Mac上用g ++编译为:
__Z6MyFuncSs
解读为:
MyFunction(std::string)
使用clang ++编译时,它是:
__Z6MyFuncNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE
解读为:
MyFunc(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)
在Linux上没有相同的问题 有谁知道为什么?
答案 0 :(得分:6)
编译器是兼容的,但它们的默认标准库不是。
在Linux上没有相同的问题任何人都知道为什么?
在GNU / Linux上,您可能正在使用clang + libstdc ++,因此它与GCC + libstdc ++兼容,因为它使用了与libstdc ++相同的std::string
定义。
在Mac OS X上,您使用的是clang + libc ++,它与GCC + libstdc ++不兼容,它们以不同的方式定义std::string
,因此您会得到不同的错位名称。
一个选项是在Mac OS X上使用Clang编译时使用-stdlib=libstdc++
,告诉它使用libstdc ++,但是Mac OS X附带的libstdc ++版本很古老,不支持任何C + +11。这样做也可能意味着您无法链接到使用C ++标准库的其他本机Mac OS X库,因为它们可能不是使用-stdlib=libstdc++
构建的
答案 1 :(得分:0)
C ++标准要求有一种方法来消除重载名称的歧义,但它留下实际的方法来实现。大多数实现使用名称修改来实现这一点,但是以他们自己独特的方式执行。
底线是:不要指望任何两个编译器使用相同名称的重整技术。即使是同一编译器的两个版本也可以改变(并且已经改变)它们如何执行名称修改。