В настоящее время я использую функцию popen
в коде, который скомпилирован двумя компиляторами: MS Visual Studio и gcc (в Linux). Возможно, я захочу добавить gcc (в MinGW) позже.
Функция называется popen
для gcc, но _popen
для MSVS, поэтому я добавил в свой исходный код следующее:
#ifdef _MSC_VER
#define popen _popen
#define pclose _pclose
#endif
Это работает, но я хотел бы понять, существует ли стандартное решение для таких проблем (я вспоминаю аналогичный случай с stricmp
/ strcasecmp
). В частности, я хотел бы понять следующее:
_MSC_VER
правильным флагом, от которого следует зависеть? Я выбрал его, потому что у меня сложилось впечатление, что окружение linux «более стандартно». #define
в какой-то файл заголовка, важно ли я #include
до или после stdio.h
(для случая popen
)? _popen
определен как макрос, существует ли шанс, что мой #define
не сработает? Должен ли я использовать вместо этого «новый» токен, например my_popen
,
До сих пор я использовал "low + (high-low) / 2" ... Я ищу эффективную формулу, работающую на Java, которая вычисляет следующее выражение:
(low + high) / 2
, которое используется для двоичного поиска. До сих пор я использовал «низкий + (высокий - низкий) / 2» и «высокий - (высокий - низкий) / 2». чтобы избежать переполнения и потери значимости в некоторых случаях, но не в обоих случаях. Теперь я ищу эффективный способ сделать это для любого целого числа (при условии, что целые числа находятся в диапазоне от -MAX_INT - 1 до MAX_INT).
UPDATE :
Самая левая средняя точка
halfLow = (low >> 1), halfHigh = (high >> 1);
mid = halfLow + halfHigh + ((low-2*halfLow + high-2*halfHigh) >> 1);
Самая правая средняя точка
low++
halfLow = (low >> 1), halfHigh = (high >> 1);
mid = halfLow + halfHigh + ((low-2*halfLow + high-2*halfHigh) >> 1);
До середины
high--;
halfLow = (low >> 1), halfHigh = (high >> 1);
mid = halfLow + halfHigh + ((low-2*halfLow + high-2*halfHigh) >> 1);
После середины
halfLow = (low >> 1), halfHigh = (high >> 1);
mid = halfLow + halfHigh + ((low-2*halfLow + high-2*halfHigh) >> 1) + 1;
Примечание : указанный выше оператор >>
считается сдвигом со знаком.