Самый стандартный способ выбора имени функции в зависимости от платформы?

В настоящее время я использую функцию popen в коде, который скомпилирован двумя компиляторами: MS Visual Studio и gcc (в Linux). Возможно, я захочу добавить gcc (в MinGW) позже.

Функция называется popen для gcc, но _popen для MSVS, поэтому я добавил в свой исходный код следующее:

#ifdef _MSC_VER
#define popen _popen
#define pclose _pclose
#endif

Это работает, но я хотел бы понять, существует ли стандартное решение для таких проблем (я вспоминаю аналогичный случай с stricmp / strcasecmp ). В частности, я хотел бы понять следующее:

  1. Является ли _MSC_VER правильным флагом, от которого следует зависеть? Я выбрал его, потому что у меня сложилось впечатление, что окружение linux «более стандартно».
  2. Если я помещаю эти #define в какой-то файл заголовка, важно ли я #include до или после stdio.h (для случая popen )?
  3. Если _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;
    

    Примечание : указанный выше оператор >> считается сдвигом со знаком.

8
задан eold 1 February 2011 в 13:48
поделиться