В настоящее время я использую функцию 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
, по той или иной причине? - Кто-то уже сделал эту работу для меня и сделал хороший файл «заголовка переносимости», который я могу использовать?
- Что-нибудь еще, о чем я должен знать?