不应检测到“控件可能到达非空函数的结尾”,因为实际上不存在这种可能性。可能是数据流分析没有正确检测到这一点。
但是,有一个更好的替代方案可以实现这一点,它也可以解决您的问题:
int compare(const void *a, const void *b)
{
return (*(const int*)b < *(const int*)a) - (*(const int*)a < *(const int*)b);
}
顺便说一句。此代码的性能更好,因为您不再需要任何分支。
一个用于演示的小型 MCVE:
#include <iostream>
int compare(const void *a, const void *b)
{
return (*(const int*)b < *(const int*)a) - (*(const int*)a < *(const int*)b);
}
int main()
{
int a = 1, b = 2;
std::cout << "compare(&a, &b): " << compare(&a, &b) << '\n';
std::cout << "compare(&b, &a): " << compare(&b, &a) << '\n';
std::cout << "compare(&a, &a): " << compare(&a, &a) << '\n';
return 0;
}
输出:
compare(&a, &b): -1
compare(&b, &a): 1
compare(&a, &a): 0
Live Demo on coliru
我必须承认,当我回答时,有人“强迫”我使用这个漂亮的比较技巧
SO: Sorting an array of integers in alternate fashion using qsort function..
这是我在那里给出的解释:
它是如何工作的:
如果a < b:(a > b) - (a < b) ⇒ 0 - 1 ⇒ -1
如果a == b:(a > b) - (a < b) ⇒ 0 - 0 ⇒ 0
如果a > b:(a > b) - (a < b) ⇒ 1 - 0 ⇒ 1