Вместо того, чтобы заканчивать загроможденными файлами, содержащими блоки #ifdef
.. #else
.. #endif
, я бы предпочел версию, использующую разные файлы для разных платформ:
- помещает зависящие от ОС определения в один файл для каждой платформы и
#define
макрос my_popen
#include
этот файл в коде, не зависящем от вашей платформы
- никогда не вызывает функции ОС напрямую, но
#define
, который вы создали (т.е. my_popen
)
- в зависимости от вашей ОС, используйте разные заголовки для компиляции (например,
config/windows/mydefines.h
в Windows и config/linux/mydefines.h
в Linux, поэтому установите соответствующий путь включения и всегда #include "mydefines.h"
)
Это гораздо более чистый подход, чем принятие решения об ОС в самом источнике.
Если методы, которые вы вызываете, ведут себя по-разному в Windows и Linux, решите, какой из них будет поведением, которое вы используете (т. Е. Либо всегда поведение Windows или всегда поведение Linux ), а затем создайте методы-оболочки для достижения этой цели. Для этого вам также понадобятся не только два mydefines.h
файла, но и myfunctions.c
файлы, которые находятся в каталогах config/OSTYPE
.
Делая это таким образом, вы также получаете преимущества, когда дело доходит до сравнения версий linux и windows: вы можете просто различать два файла, выполняя diff для блоков linux и windows одного и того же файла может быть трудно.