В настоящее время я использую функцию popen
в коде, которая скомпилирована двумя компиляторами: MS Visual Studio и gcc (on linux). Возможно, мне захочется добавить gcc (на MinGW) позже.Самый стандартный способ выбора имени функции в зависимости от платформы?
Функция называется popen
для GCC, но _popen
для МСВС, поэтому я добавил следующее к моему исходному коду:
#ifdef _MSC_VER
#define popen _popen
#define pclose _pclose
#endif
Это работает, но я хотел бы понять, существует ли стандартное решение такие проблемы (я вспоминаю аналогичный случай с stricmp
/strcasecmp
). В частности, я хотел бы понимать следующее:
- Действительно ли
_MSC_VER
правильный флаг, от которого зависит? Я выбрал его, потому что у меня создается впечатление, что среда Linux более «стандартная». - Если я помещаю эти
#define
в какой-либо заголовочный файл, важно ли оно: i#include
оно до или послеstdio.h
(для случаяpopen
)? - Если
_popen
определяется как сам макрос, есть ли шанс, что мой#define
не получится? Должен ли я использовать «новый» токен, например,my_popen
, по той или иной причине? - Кто-то уже выполнил эту работу для меня и создал хороший файл «portability header», который я могу использовать?
- Что-нибудь еще, о чем я должен знать?