Windows目标项目, Visual Studio 2012
我试图使用std::sort对结构指针数组进行排序。排序是从结构中包含的GUID完成的,所以我想为我的排序调用定义一个自定义比较函数。
std::sort(
std::begin(pUnits),
std::end(pUnits),
MyCustomSortFunctionHere
);
现在我的问题是,提供的比较功能的预期调用约定是什么?问题可能是,呼叫惯例在这里是否会产生影响?
我需要知道的原因是,我的项目设置使用默认的调用约定,所以如果我声明我的比较函数而没有明确声明调用约定,我想知道它是否会破坏。似乎无法在任何地方找到任何相关信息。
感谢。
答案 0 :(得分:4)
我的理由是MyCustomSortFunctionHere
函数(或类方法?)使用您要求的调用约定调用:with
extern "C" bool MyCustomSortFunctionHere(Unit const*, Unit const*);
它将用" C"召集会议。
由于std::sort()
是一个模板函数,它实际上与您的代码一起编译在同一个翻译单元中,包括调用比较函数的部分,并且对MyCustomSortFunctionHere
的调用遵循您指定的规则在那个翻译单位。
如果要在同一个翻译单元中定义比较功能,则应该不指定任何约定。 如果函数是在不同的转换单元中定义的,则需要向编译器表达哪个是正确的调用约定。
答案 1 :(得分:0)
您的MyCustomSortFunctionHe如何实现?
一个。使用仿函数或,
湾使用方法签名bool cmp(const Type1& a,const Type2& b)
在第一种方法的情况下" thiscall"使用调用约定,在第二种方法的情况下使用__cdecl调用约定。 我使用Visual Studio编译器为上述每种方法生成的代码的反汇编验证了上述内容。
希望这有帮助!